看了好多文章講js深拷貝的,但是測試了一下,還有很多地方不完善的,
結合別人的**和自己的理解,自己實現了乙個深拷貝。
首先要考慮拷貝的目標物件是不是 null,因為 typeof null 結果是 object,如果是null就直接返回null。
然後我們再判斷各種包裝物件,因為基本資料型別的包裝物件,new string , new number , new boolean ,會把基本型別轉為物件型別,基本資料型別的原始值是不可引用和更改的,所以拷貝出來就是乙個空的包裝物件,另外還有date包裝物件和regexp包裝物件,也是同樣的道理。
如果是普通物件,陣列,或者類陣列,就直接遍歷每個元素並複製,為了完全複製目標物件,在複製之前,我們需要利用目標物件的constructor建構函式new乙個新的空物件,這樣,就可以繼承目標物件原型上的屬性,如果使用for in迴圈的話,我們還需要在迴圈遍歷的時候判斷目標物件的屬性是否是屬於自己的,避免複製到原型上的屬性,也可以使用object.getownpropertynames()方法先把目標自身屬性,最後再遞迴,以達到深層複製
當然,如果目標不是物件就肯定是基本資料型別,直接返回就行。
最後將已經複製的物件返回,就完成了乙個深拷貝
**如下:
function
測試一下:
可以看出,拷貝的物件和目標物件是完全一致的,我們再試一下,能否拷貝到目標物件繼承自原型上的屬性。
personobj物件原型上的show方法,也被拷貝到_proto__屬性裡了。
目前我就考慮到這麼多,不知道還有哪些地方需要考慮的。
js物件深拷貝
由於引用型別 陣列 物件 是按位址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝乙個物件,這時就需要遍歷徹底複製,使原物件和拷貝物件完全脫離關係。function deepcloneobj obj for i in obj return o 實現細節 假定傳入的是乙個引用...
js 物件深拷貝 深拷貝與淺拷貝
前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...
js物件的深拷貝
關於物件的深拷貝一直是大家津津樂道乙個話題,本騷年通過研究 yuedu 發現還是很easy的。首推的方法簡單有效,json.stringfy 和json.parse 即可搞定。但是這種簡單粗暴的方法有其侷限性。當值為undefined function symbol會在轉換過程中被忽略。所以,物件值...