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