今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結:
js中針對引用型別的拷貝分為兩種:深拷貝和淺拷貝;淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如:
var obj = ;
var newobj = obj;
newobj.a =
4;console.
log(obj.a);// 4,淺拷貝,拷貝的僅僅是引用
另一類淺拷貝,則是對引用型別的屬性進行拷貝,但是屬性值如果也是引用型別,則拷貝的就是該屬性值的物件引用,如:
var obj1 = };
var newobj1 = {};
for(var i in obj1)
newobj1.a = 6
;newobj1.c
.c1=7
;console.log(obj1.a); // 1,基礎型別,無影響
console.log(obj1.c
.c1); // 7,引用型別,拷貝引用,相互影響
由上面兩個簡單的例子我們可以看到,淺拷貝在處理引用型別的時候是有弊端的。因此,引用型別資料的複製更好的辦法就是採用深拷貝,對源物件以及其屬性進行遍歷,其實就是採用遞迴的方式深入到物件最底層,把所有的值都拷貝過來:
var initobj= }};
function
deepcopy
(obj1); //給新物件或陣列乙個初始值
for(var key in obj1)else
} return obj2;
}var newobj = deepcopy(initobj);
console.log(newobj);//}};
用深拷貝實現的引用型別複製,則不會對源物件產生影響,上述函式即可很方便地實現深拷貝; JS中的深拷貝與淺拷貝
說到深淺拷貝的時候就不得不說一下js中的變數型別了 淺拷貝分兩種情況,拷貝源物件的引用和源物件拷貝例項,但其屬性拷貝引用.拷貝源的引用 eg let obj1 let obj2 obj1 console.log obj1 obj2 true obj1.a 2 console.log obj2.a 2...
JS中的深拷貝與淺拷貝
深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,深拷貝的實現 1.通過遞迴解決 var a function deepcopy initobj,finalobj for var i in initobj if typeof initobj i object argume...
JS中的深拷貝與淺拷貝
淺拷貝是物件的逐位複製。建立乙個新物件,該物件具有原始物件中值的精確副本。如果物件的任何欄位是對其他物件的引用,則只複製引用位址,即,複製記憶體位址。大白話講就是,淺拷貝是對物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變...