JS陣列和物件的淺拷貝和深拷貝

2022-09-07 03:42:10 字數 1590 閱讀 9468

共勉~

在許多程式語言中,傳遞引數和賦值是通過值的直接複製或者引用複製完成的。在j**ascript中,對於值是直接進行複製還是引用複製在語法上是沒有區別的,完全是根據值的型別來決定的。

在j**ascript中,簡單值總是通過值的直接複製來進行賦值傳遞的(null,undefined,字串,數字,布林,symbol),而復合值(物件(包括陣列等)和函式)總是通過引用複製的方式來進行賦值和傳遞的。

下面的例子能加深理解:

var a = 1;

var b =a;

b++;

a; //

1b; //

2var c = [1,2];

var d =c;

d.push(3);

c; //

[1,2,3]

d; //

[1,2,3]

上面例子對於陣列的賦值操作就是陣列的淺拷貝,不難發現問題當乙個陣列改變的時候,其他賦值的陣列也會改變,在很多類似備份的情況中,這並不是我們想要的結果。

var c = [1,2];

var d =c;

d.push(3);

c; //

[1,2,3]

d; //

[1,2,3]

我們可以通過兩種方法來實現陣列的深拷貝:

var a = [1,2,3];

var b = a.slice(0);

var c =a.concat();

b.push(4);

c.push(5);

a; //

[1,2,3]

b; //

[1,2,3,4]

c; //

[1,2,3,5]

相對來說陣列的拷貝比較簡單,而物件的淺拷貝我們也可以簡單實現:

function

easyclone(obj) ;

for ( var i in

obj)

return

objnew;

}

其實就是將每個原物件的屬性和值複製到新物件上去,當然我們也可以使用object.assign() 方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,然後返回目標物件,同時object.assign() 也是淺拷貝,有興趣的同學可以看看。

淺拷貝因為沒有遞迴迴圈檢查物件的每個值是否是物件,而是直接進行了賦值,所以如果某個值是物件的時候就會出現問題,所以在一般情況下我們需要用深拷貝來進行備份。

最簡單的深拷貝:

b = json.parse( json.stringify(a) )

侷限性:

其實簡單的深拷貝只需要我們遞迴呼叫淺拷貝就可以了:

function

deepcopy(obj) ;

for (var i in

obj) ;

deepcopy(obj[i], objnew[i]);

} else

}  return

objnew;

}

js物件淺拷貝和深拷貝

1 淺拷貝 varobj 定義乙個物件 functioncopy obj 定義乙個空物件,用來儲存key和value for varkeyinobj returnnewobj 將新物件作為返回值,返回到外面 varobj2 copy obj 將obj複製給obj2 obj2.a 20 改變obj2中...

js物件的深拷貝和淺拷貝

淺拷貝 只是複製指向某個物件的指標,而不複製物件本身新舊物件,它們還是共享同一記憶體。深拷貝 會另選創造乙個一模一樣的物件,新物件和原物件不共享記憶體,修改新物件不會改到原物件。也就是老死不相往來了。知道了深淺拷貝的含義,那就來總結如何實現深淺拷貝。let data 第一種情況 let obj da...

陣列和物件的淺拷貝和深拷貝

前言 對於拷貝需要考慮資料的型別 資料型別分為 基本資料型別和引用型別 基本資料型別是儲存在棧中的簡單資料 常見 string,number,undefined,null,boolean以及es6新定義的symbol 引用型別值是引用型別例項,它是儲存在堆中的乙個物件,引用型別是一中資料結構 常見 ...