一:什麼是深拷貝?
舉例:a=b,正常情況下當改變a時b也改變,當改變a時b第一層不改變copy就是淺拷貝,當改變a時b底基層都不會改變就是深拷貝
二:實現深拷貝
1、最簡單方法就是使用json.stringfy()和json.parse()。
var syb = symbol('obj');var person = ,
ok: syb,
un: undefined
}var copyperson = json.parse(json.stringify(person))
但是有侷限性:當值為undefined
、function
、symbol
會在轉換過程中被忽略,物件值有這三種的話用這種方法會導致屬性丟失。
2、通用方法(遞迴複製)
deepclone => (obj);if(obj && typeof obj==="object")else}}
}return objclone;
}
另外注意obj.hasownproperty(key)有什麼用?
使用了for in遍歷陣列,就需要用hasownproperty來規避遍歷到原型鏈上的屬性或方法
理解js淺拷貝和深拷貝
理解深拷貝和淺拷貝之前先了解下js中的基本型別和引用型別 1 基本型別 在js中,資料的基本型別undefined,null,string,number,boolean,在變數中賦的實際值,基本型別就是簡單的資料段。基本型別的值是不可以改變的 var a 1 var b a a console.lo...
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 深拷貝 思路 遞迴...