js實現深拷貝

2021-08-19 23:22:12 字數 1099 閱讀 9556

深拷貝:深拷貝本身只針對較為複雜的object型別資料,但是含義的話比如基本資料型別a和b的賦值操作,賦值之後b有自己的記憶體空間,a,b之間互不影響

淺拷貝:引用資料型別--名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供乙個引用的位址指向堆記憶體中的值。當b=a進行拷貝時,其實複製的是a的引用位址,而並非堆裡面的值。而當我們a[0]=1時進行陣列修改時,由於a與b指向的是同乙個位址,所以自然b也受了影響,這就是所謂的淺拷貝了。要是在堆記憶體中也開闢乙個新的記憶體專門為b存放值,就像基本型別那樣,起步就達到深拷貝的效果了

總結以下深拷貝有以下三種方式:

1.json物件的parse和stringify(解析與反解析)

function deepclone(obj)    

let a=[0,1,[2,3],4],

b=deepclone(a);

a[0]=1;

a[2][0]=1;

console.log(a,b);

2.jq的extend方法

$.extend( [deep ], target, object1 [, objectn ] )

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

target object型別 目標物件,其他物件的成員屬性將被附加到該物件上。

object1  objectn可選。 object型別 第乙個以及第n個被合併的物件。 

let a=[0,1,[2,3],4],

b=$.extend(true,,a);

a[0]=1;

a[2][0]=1;

console.log(a,b);

3.使用遞迴去複製所有層級屬性

function deepclone(obj);

if(obj && typeof obj==="object")else}}

}return objclone;

}

let a=[1,2,3,4],

b=deepclone(a);

a[0]=2;

console.log(a,b);

JS 深拷貝實現

web平台上一直在刻意的避開深拷貝,一直使用json.parse json.stringify object 避開深拷貝的問題。知道今天碰見個bug,json將function轉化為了字串,排到這個bug時,憔悴 若是node.js平台的話,一直現成的輪子等著挑,可惜是web,不太敢亂引入,手寫乙個...

js實現深拷貝

var obj var newobj obj console.log newobj obj.number 2 console.log obj console.log newobj 發現此時newobj的number也變成了2,很顯然這不是我們想要的結果。往往我們開發專案中會大量用到賦值,卻發現之前原...

JS實現深拷貝

缺點 1 如果物件裡有函式,函式無法被拷貝下來 2 無法拷貝copyobj物件原型鏈上的屬性和方法 3 當資料的層次很深,會棧溢位 function deepcopy source 陣列相容 for var k in source else return target function isobje...