浅拷贝
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
};
var o = {};
for(var k in obj) { //k为属性名,obj[k]属性值
o[k] = obj[k];
}
console.log(o);
浅拷贝中的引用数据类型会直接复制对象的引用地址,也就是拷贝后的引用数据和原对象中指向同一个引用类型地址。
ES6中提供了一个Object.assign(target, origin)方法实现浅拷贝,那么上述代码实现的浅拷贝,现在可用一行代码代替
Object.assign(o, obj); //将obj对象中的内容拷贝到o对象中
深拷贝
递归实现深拷贝
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {};
function deepCopy(newobj, oldobj) {
for(var k in oldobj) {
//1、获取属性值
var item = oldobj[k];
//2、判断这个值是否为数组
if (item instanceof Array) {//数组也属于Object,所以将Array放在了Object前面
newobj[k] = [];
deepCopy(newobj[k], item);
} else if (item instanceof Object) { //3、判断这个值是否为对象
newobj[k] = {};
deepCopy(newobj[k], item);
} else {//4、这个值为简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o);