JS中實現陣列和物件的深拷貝和淺拷貝

2021-10-09 01:09:52 字數 2034 閱讀 1713

> 陣列的深拷貝,兩層

var arr = [[1,2,3],[4,5,6],[7,8,9]];

var arr2 =;

迴圈第一層陣列

for(var i=0,len=arr.length;i)

}console.log(arr2);

//[1, 2, 3, 4, 5, 6, 7, 8, 9]

console.log(arr===arr2); //

false

> 陣列的淺拷貝,一層

var arr = [1,2,3,4,5,6,7,8];

var arr2 =;

for(var i=0,len=arr.length;i)

console.log(arr2);

console.log(arr===arr2);

> 陣列的深拷貝,三層

var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11];

var arr2 =;

//第一層迴圈

for(var i=0,len=arr.length;i)

//第二層for(var k=0,len1=arr[i].length;k)

}else}}

console.log(arr2);

//[1, 2, 3, 4, 5, 6, 7, 8, 9,10,11]

console.log(arr===arr2); //

false

> 陣列的深拷貝,無限層,正則版 1.0

var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]]];

var arr2 =;

//先把陣列轉換成字串,然後將字串裡面的刪除

var str = arr.tostring().replace(/\[|\]/,"");

console.log(str);

//1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

//將字串轉換成陣列。

arr2 = str.split(",");

console.log(arr2); //["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"]

console.log(arr===arr2); //false

// 這樣做的話簡單了不少,而且擴充套件性比較強,但是現在出現了個bug,就是我們原本陣列裡面的是數字,現在變成了字串,下面我們來解決一下這個問題。

> 陣列的深拷貝,無限層,正則版 2.0

var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]],"a"];

var arr2 =;

//先把陣列轉換成字串,然後將字串裡面的刪除

var str = arr.tostring().replace(/\[|\]/,"");

console.log(str);

//1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

//將字串轉換成陣列。

arr2 = str.split(",");

for(var i=0,len=arr2.length;i)

console.log(arr2);

//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, "a"]

console.log(arr===arr2); //

false

JS陣列和物件實現深拷貝

for 迴圈 for 迴圈 copy function copyfun arr return copyarr let arr1 1 2,3 4 let arr2 copyfun arr1 1,2,3,4 console.log arr2 1,2,3,4 arr2 0 10 console.log a...

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

共勉 在許多程式語言中,傳遞引數和賦值是通過值的直接複製或者引用複製完成的。在j ascript中,對於值是直接進行複製還是引用複製在語法上是沒有區別的,完全是根據值的型別來決定的。在j ascript中,簡單值總是通過值的直接複製來進行賦值傳遞的 null,undefined,字串,數字,布林,s...

JS深拷貝陣列和物件

有時候在些js 時不小心直接給陣列和物件直接賦值,可能不會直接產生什麼 但若是遇到了奇怪的問題了,這很有可能就是在拷貝陣列或者物件時時進行淺拷貝,接受者在不知不覺地改變了某些元素的值,從而導致原始值就莫名其妙地被同步修改了 面對這種情況,最好對陣列或者物件進行深拷貝,為了不影響某些元素的丟失 比如某...