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));