JavaScript的深克隆和淺克隆

編程語言 JavaScript jQuery 教育 騰訊課堂 2017-06-22

JavaScript的深克隆和淺克隆

最近在複習,發現前端好多知識點牽一髮動全身。

比如我想看一下JQuery的extend源碼,就不得不再好好看看深克隆淺克隆的問題。


什麼是深克隆?

我們都知道,JavaScript有六種基本的數據類型。

五種基本的數據類型:string,number,undefined,boolean,null

(在內存中表現為一個值,保存在棧中)

一種複雜的數據類型(引用類型):object 【function,array,object】

(在內存中表現為一個指針,保存在堆中)

將一個對象的所有屬性均複製,並將該對象與原對象放在內存中不同的位置,此時,改變新對象的屬性不會對原對象造成影響,這種行為叫做深克隆。


我們還是先看淺克隆吧。。。

 var people= { name:"sun", age:24, hobby:["eat","shopping"], son:{ age:3

JavaScript的深克隆和淺克隆

看他們的愛好!!.png

淺克隆只是簡單的複製對象,若對象其中一個屬性是引用值,由於引用型變量保存的是內存的一個地址,所以後來的

hobby

屬性,都指向內存中的同一塊地址,最後輸出的結果同樣相同。

從上面的例子也可以看出,

name

等原始值的改變,並不會影響原對象中的原始值。

解決克隆引用值問題,還是需要深度克隆的!

for-in循環遍歷對象上的所有屬性,判斷是否為引用值,若是,進行遞歸,直到所有屬性都為原始值為止。

拷貝出來後,就是一個全新對像,就和之前沒什麼關係了,以前的改變也不能對新的產生影響!!

var people= { name:"sun", age:24, hobby:["eat","shopping"], son:{ age:3

JavaScript的深克隆和淺克隆

看他們的愛好!!.png


一些擴展

  • js裡的concat函數

    concat函數對數組進行了深度克隆

    var a = [1,2,3];
  • jQuery.extend( [deep ], target, object1 [, objectN ] )

    deep

    類型: Boolean

    如果是true,合併成為遞歸(又叫做深拷貝)默認值為false,表示淺拷貝。

    target

    類型: Object

    對象擴展。這將接收新的屬性。

    object1

    類型: Object

    一個對象,它包含額外的屬性合併到第一個參數.

    objectN

    類型: Object

    包含額外的屬性合併到第一個參數

    1.合併兩個對象,並修改第一個對象

    var a= { name:"sun", age:24, hobby:["eat","shopping"], son:{ age:3

JavaScript的深克隆和淺克隆

b覆蓋了a的原有屬性.png

2.當繼承的對象屬性中有引用類型的時候,兩個對象同時指向一個對象,改變一個另一個也隨之改變。如果有相同屬性,後邊的會覆蓋前邊的

var a= { name:"sun", age:24, son:{ age:3, name:"小名"

JavaScript的深克隆和淺克隆

相關推薦

推薦中...