深拷貝
說到深拷貝,肯定想到的最簡單的方式就 JSON.stringify 和 JSON.parse 配合,這個是最簡單的深拷貝方式
手寫一個深拷貝
深拷貝 = 淺拷貝 + 遞歸 ,這個只是最笨的一種方式
var a = {
name: "muyiy",
book: {
title: "You Don't Know JS",
price: "45"
},
a1: undefined,
a2: null,
a3: 123
}
// hasOwnProperty表示是否有自己的屬性。這個方法會查找一個對象是否有某個屬性,但是不會去查找它的原型鏈。
function cloneDeep1(source) {
var target = {};
for (var key in source) {
if (source.hasOwnProperty(key)) {
if (typeof source[key] === 'object') {
target[key] = cloneDeep1(source[key]); // 注意這里
} else {
target[key] = source[key];
}
}
}
return target;
}
// 使用上面測試用例測試一下
console.log(a)
var b = cloneDeep1(a);
a.name = "前端進階";
a.book.price = "55";
console.log(b);
考慮再全一些的深拷貝
function deepClone(obj,hash = new WeakMap()){ //遞歸實現
if(obj instanceof RegExp) return new RegExp(obj);
if(obj instanceof Date) return new Date(obj);
if(obj === null || typeof obj != "object"){
// 普通數據類型
return obj;
}
if(hash.has(obj)){
return hash.get(obj);
}
// 下面是數組和對象的判斷
let t = new obj.constructor();
hash.set(obj,t);
for(let key in obj){
// 遞歸
if(obj.hasOwnProperty(key)){ //是否是自身的屬性
t[key] = deepClone(obj[key],hash)
}
}
return t;
}
當然 遞歸很容易爆棧,只是別的方法我還尚未全完能夠理解出來