克隆的概念
淺度克麓∨馈:原始類型為值傳遞甫贯,對象類型仍為引用傳遞吼鳞。
-
深度克驴囱痢:所有元素或?qū)傩跃耆珡?fù)制,與原對象完全脫離赔桌,也就是說所有對于新對象的修改都不會反映到原對象中供炎。
看一個淺克隆//淺克隆 function clone(obj) { var result = {}; for (key in obj) { result[key] = obj[key]; } return result; } var Person = { name: "jack", age: "18", Address: { province: "beijing" }, }; var New = clone(Person); console.log(Person.Address.province); //beijing New.Address.province = "shanghai"; console.log(Person.Address.province); //shanghai
在看一個深克隆
//深度克隆
function deepClone(obj) {
var result, oClass = isClass(obj);
if (oClass === 'Object') { //初始化result類型
result = {};
} else if (oClass === 'Array') {
result = [];
} else {
return obj;
}
for (key in obj) {
var copy = obj[key];
if (isClass(copy) == 'Object') {
result[key] = arguments.callee(copy);////遞歸調(diào)用
} else if (isClass(copy) == 'Array') {
result[key] = arguments.callee(copy);
} else {
result[key] = obj[key];
}
}
return result;
}
function isClass(o) {//判斷傳入的類型
if (o === null) return 'Null';
if (o === undefined) return 'Undefined';
return Object.prototype.toString.call(o).slice(8, -1);
}
var Person = {
name: "jack",
age: "18",
Address: {
province: "beijing"
},
};
var New = deepClone(Person);
New.name = "tom";
New.Address.province = "shanghai";
console.log(Person.name); //jack
console.log(Person.Address.province); //beijing
console.log(New.name); //tom
console.log(New.Address.province); //shanghai