淺拷貝:只複製物件的基本型別,對於引用型別,只是轉殖位址(包含的內嵌的物件或陣列,不再複製副本)
引用型別,只是轉殖位址,那麼原物件修改,轉殖後的新物件也會跟著變化,轉殖不徹底
陣列的array.from()
方法就是實現的淺拷貝
物件的object.assign()
方法也是實現的淺拷貝
深拷貝:複製物件的基本型別和引用型別(包含的內嵌的物件或陣列,依然複製副本)
實現深拷貝需要用到遞迴的思想function lowclone(val)
for (var key in val)
return newobj
}var obj =
}var result = lowclone(obj)
// 用json.stringify方便看列印結果
console.log(json.stringify(result)) //}
obj.c.c1 = 7;
obj.b[2] = [5, 6]
console.log(json.stringify(obj)) //}
console.log(json.stringify(result)) //}
// 可以看出淺轉殖的原物件改變,轉殖後的物件屬性也跟著改變,淺轉殖只是轉殖位址。
具體**如下:
看列印結果,可以看出實現了深拷貝。// 實現深拷貝
function deepclone(val)
//判斷是array
if (val instanceof array)
//判斷是物件
var newobj = {}
for (var key in val)
} return newobj
}var obj =
}var result = deepclone(obj);
// 用json.stringify方便看列印結果
console.log(json.stringify(obj)) //}
console.log(json.stringify(result)) //}
obj.c.c1 = 7;
obj.b[2] = [5, 6]
console.log(json.stringify(obj)) //}
console.log(json.stringify(result)) //}
C 淺轉殖與深轉殖(淺拷貝與深拷貝)
介紹 1 淺轉殖 在淺轉殖中,如果原型物件的成員變數是值型別,將複製乙份給轉殖物件 如果原型物件的成員變數是引用型別,則將引用物件的位址複製乙份給轉殖物件,也就是說原型物件和轉殖物件的成員變數指向相同的記憶體位址。簡單來說,在淺轉殖中,當物件被複製時只複製它本身和其中包含的值型別的成員變數,而引用型...
js實現深拷貝和淺拷貝
let obj let newobj obj.age.age 25 修改第二層的obj.age.age,newobj.age.age也會跟著變化 console.log newobj 複製 注意 資料的slice和concat方法也是淺拷貝,只能拷貝一層 原理 把乙個物件轉化成乙個字串,再把這個字串...
js實現深拷貝和淺拷貝
淺拷貝 思路 把父物件的屬性,全部拷貝給子物件,實現繼承。問題 如果父物件的屬性等於陣列或另乙個物件,那麼實際上,子物件獲得的只是乙個記憶體位址,不會開闢新棧,不是真正拷貝,因此存在父物件被篡改的可能。function deepcopy o for i in o return f 深拷貝 思路 遞迴...