js中对象分为基本类型和复合(引用)类型。基本类型存放在栈内存,复合(引用)类型存放在堆内存。
栈内存存放一些基本类型的变量和对象的引用变量,堆内存用于存放由new创建的对象。
浅拷贝仅仅是指向被拷贝的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。
???????var obj = { ???????????a : 1, ???????????b : 2 ???????} ???????var obj1 = obj; ???????????obj1.b = 3; ???????console.log(obj1); //{a: 1, b: 3}
? console.log(obj1===obj); ?//true
深拷贝:我在想如何让obj1复制obj的对象内容,在我对obj1进行修改时,不影响obj。通过递归调用浅拷贝来解决。
???????let obj = { ???????????a : "1", ???????????b : "2", ???????????c : function col(){}, ???????????d : [1,2,3], ???????????e : { ???????????????f : "4" ???????????} ???????}
???????function deepCopy(obj){ ???????????if(typeof obj === "object"){ ???????????????if(obj.constructor === Array){ ???????????????????var newArr = []; ???????????????????for(var i = 0;i<obj.length;i++) newArr.push(obj[i]); ???????????????????return newArr; ???????????????}else{ ???????????????????var newObj = {}; ???????????????????for(var key in obj){ ???????????????????????newObj[key] = this.deepCopy(obj[key]); ???????????????????} ???????????????????return newObj; ???????????????} ???????????}else{ ???????????????return obj; ???????????} ???????}
简化:
???????function deepCopy(obj){ ???????????let temp = obj.constructor === Array?[]:{}; ???????????for(let val in obj){ ???????????????temp[val] = typeof obj[val] == ‘object‘ ? deepCopy(obj[val]) : obj[val]; ???????????} ???????????return temp; ???????} ???????console.log(deepCopy(obj));
js深拷贝和浅拷贝
原文地址:http://www.cnblogs.com/zhang-wang/p/7581215.html