var obj={a:1,b:2,c:{d:1,e:[3,4,5]}};
浅拷贝:复制的是对象的引用,而不是对象本身,新旧对象还是共享一块内存
方法一:for in
function shadowCopy(obj) {
var result = {};
for (var i in obj) {
result[i] = obj[i];
}
return result;
}
var result = shadowCopy(obj);
result.c.d = 2;
obj.c.d = 2
方法二:Object.assign
var result = Object.assign({}, obj);
result.c.d = 2;
obj.c.d
深拷贝:创造一个一模一样的对象,新对象与旧对象不共享内存,修改新对象不会改到原对象
方法一:转换为JSON字符串后再转换为JSON对象,缺点:针对函数不能区分类型,故普通对象建议采用此种方式
var result = JSON.parse(JSON.stringify(obj));
result.c.d = 2;
obj.c.d
方法二:递归
var deepCopy = (function f(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var i in obj) {
if (typeof obj[i] === "object") {
result[i] = f(obj[i]);
} else {
result[i] = obj[i];
}
}
return result;
});
var result = deepCopy(obj);
result.c.d = 2;
obj.c.d