深拷贝和浅拷贝
·
Yin灏
浅拷贝:只拷贝一层,更深层次对象级别只拷贝引用。
深拷贝:拷贝多层,每一级的数据都会拷贝。
var obj = {
id: 1,
name: 'andy'
}
var o = {};
for(var k in obj) {
o[k] = obj[k];
}
console.log(o)
o.id = 2;
console.log(obj); // { id: 1, name: "andy" }
/*
浅拷贝:只拷贝一层。
*/
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
}
var o = {};
for(var k in obj) {
o[k] = obj[k];
}
o.msg.age = 20;
console.log(obj); // { id: 1, name: "andy", msg: 20 }
/*
for...in 是浅拷贝,只能拷贝一层,
对于深层次的拷贝,拷贝的是引用地址。拷贝后的数据改变,原数据也会改变。
*/
Object.assign()
es6 新增方法可以浅拷贝。
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
}
var o = {};
Object.assign(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj); // { id: 1, name: "andy", msg: 20 }
深拷贝
通过递归方式实现深拷贝。
深拷贝封装函数:
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
}
var o = {};
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
var item = oldobj[k];
if (item instanceof Array) { // 这里要写在上面,因为数组也属于对象
newobj[k] = [];
deepCopy(newobj[k], item);
} else if (item instanceof Object) {
newobj[k] = {};
deepCopy(newobj[k], item);
} else {
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o);