浅拷贝和深拷贝是针对数组和对象(Array,Object)这种复杂数据类型来说的。
浅拷贝指的是只复制了对象中成员变量的标记,也可以理解为只复制了属性名,没有在堆里面开辟新的内存空间,如果B浅拷贝了A,那么如果B的属性值发生了改变,A也会发生改变,因为它们都是指向同一空间地址的。
var obj = {
name: '王二狗',
age: 20,
arr: [1,2,3,4],
hobby: {
game: 'LOL',
mosic: 'en'
}
}
var newObj = obj; // 浅拷贝
newObj.age = 18;
console.log(obj.age); // 18, 当修改新对象的属性值得时候原对象也会发生改变
深拷贝则是在在堆中开辟了新的内存空间来存放复制的属性值,独立于原来的对象。B深拷贝了A,当B发生改变的时候,A不会变化,因为A和B指向不同的地址。
利用递归的方式实现深拷贝:
var obj = {
name: '王二狗',
age: 20,
arr: [1,2,3,4],
hobby: {
game: 'LOL',
mosic: 'en'
}
}
// 利用递归实现深拷贝
function deepCopy(obj, newObj) {
for (var k in obj) {
if (obj[k] instanceof Array) {
newObj[k] = [];
deepCopy(obj[k], newObj[k])
} else if (obj[k] instanceof Object) {
newObj[k] = {}
deepCopy(obj[k], newObj[k])
} else {
newObj[k] = obj[k];
}
}
}
var newObj = {};
deepCopy(obj, newObj);
// 修改newObj的属性值,obj不会发生改变,说明新对象开辟了新的内存空间
newObj.hobby.game = 'Go';
console.log(obj.hobby.game); // LOL