JavaScript裏的深淺拷貝原理及方法

深淺拷貝是在複製複雜類型的值引用時的概念,我們在對象和數組中討論它的深淺拷貝

淺拷貝概念:淺拷貝既只拷貝對象的基本類型的值,並不複製引用類型的值而是引用它的指針,看以下的例子:

可以看到當a改變時b也不得不跟着改變,這就是“拿人手短”,因爲它只是引用了原來對象的指針,取了它的基本類型的值。

深拷貝概念:深拷貝可以擁有一個對象的所有屬性和方法,實現真正的“獨立自主”,不引用原來對象的指針,開闢了新的內存空間,和原來的對象不會互相影響。

淺拷貝的常見方法:

1.Object.assign()

Object.assign()拷貝的是屬性值,只實現第一層的深拷貝,而不能進行深層的深拷貝,所以歸根結底這個方法屬於應該屬於淺拷貝,讓我們來看兩個例子說明它第一級的深拷貝和第二級的淺拷貝:

2.Object.create()

直接上例子:可見Object.create()實現了淺拷貝,這個方法方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__,實質上是地址的引用,Object.create()的詳情請見:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

3.擴展運算符等

此例可得出擴展運算符展開的方法也只是基本類型值的引用,並沒有開闢新的內存空間,屬於淺拷貝。

接下來討論深拷貝的實現方法:

1.最簡單的黑科技就是使用JSON.parse(JSON.stringify(object))來實現深拷貝,上例子:

當然這個方法也有它的侷限性,比如下面這個例子,遇到undefined的值會忽略掉。

2.利用遞歸的方法和for in遍歷屬性進行深拷貝

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章