如何深淺拷貝陣列(總結)

2021-09-11 13:06:56 字數 2407 閱讀 9068

這兩天遇到了乙個問題,如何複製陣列,所以就從各個地方找了很多的解決辦法。算是整理一下,這樣以便於自己以後的學習:

2.返回新陣列方法

2.2 使用陣列map方法

2.3 使用concat方法

3.es6語法實現深拷貝

4.for-in連原型鏈也一併複製的方法

5.多維陣列的複製

首先第乙個複製陣列我們都想到的是定義乙個陣列直接相等就可以了:

var arr1 = [1,2,3];

var arr2 = arr1;

arr1[0] = 2;

console.log(arr1[0]); //2

複製**

出現這個的原因就是因為,陣列是用堆去儲存的,所以這個算是淺拷貝,相等的時候只是把存放的位址拷貝過去了,兩個指向了同乙個位址,所以在改變其中乙個的值,其他的也跟著改變了。所以如何深拷貝乙個陣列呢?

原理這個是最原始的辦法,就是把每個值取出來到另乙個陣列中。

**實現

var arr1 = [1,2,3];

var arr2 = ;

arr1.foreach(function(value,index))

console.log(arr2);

//這個時候改變arr1[0] = 3;那麼輸出arr2[0]還是等於1

複製**

###2. 返回新陣列方法 ####2.1 使用slice方法 #####原理 陣列的slice方法是擷取陣列的意思,在之前的陣列總結中也有提過。 slice(0)指的是從0開始到末尾擷取陣列,然後返回乙個新的陣列,這樣就不會影響到原來的陣列了。

**實現

var arr1 = [1,2,3];

var arr2 = arr1.slice(0);

console.log(arr2); //[1,2,3]

//這個時候改變arr1[2] = 5,那麼輸出arr2[2]還是等於3

複製**

順著這種方法是不是得到了思維的開闊,來看看還有哪些是返回新陣列的?

2.2使用陣列map方法

使用map方法遍歷陣列然後返回新的陣列,裡面的值不變

var arr1 = [2,3,4];

var arr2 = arr1.map(function(value))

console.log(arr2); //[2,3,4]

複製**

2.3使用concat方法

連線陣列,如果連線的是乙個空,那麼也是返回了新的本身的陣列

var arr1 = [3,4,5];

var arr2 = arr1.concat();

console.log(arr2); //[3,4,5]

複製**

es6擴充套件運算子實現陣列的深拷貝,目前是最簡單的。

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

var [ ... arr2 ] = arr;

console.log(arr); //[1,2,3,4,5]

console.log(arr2); //[1,2,3,4,5]

複製**

這種辦法,不僅複製的值,還會把屬性也進行拷貝。

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

arr.prototype = 5;

var arr2 = ;

for(var a in arr)

console.log(arr2); // [1,2,3,4,5]

console.log(arr2.prototype); // 5

//之前的方法中新陣列的prototype都是undefined

複製**

原理

多維陣列轉化為字串會成為一維陣列。

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

var arr1 = arr.tostring().split(",")

var arr2 = arr.join().split(",")

console.log(arr1) //[1,2,3,4,5,6]

console.log(arr2) //[1,2,3,4,5,6]

複製**

但是怎麼可以保持那種二維陣列的狀態呢?需要下面的**

**實現

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

var arr3 = json.parse(json.stringify(arr));

console.log(arr3) // [[1,2],3,4,[5,6]]

複製**

Excel VBA 如何拷貝陣列?

本文翻譯至 variant型變數 陣列 陣列是可以 儲存多個 值的 一種 變數 變數是獨幢樓房的話,數 組就是聯排別墅。vba中在陣列 名後面加上括號,裡面指定數 組元素的編號。要注意編號是從 0開始。數 組拷貝到 別的陣列 時,不是儲存到數 組裡,而是儲存到variant型變 量。vba 中不能把...

jq深拷貝陣列

通過傳遞第乙個引數true執行了深拷貝物件中的陣列 或者object 資訊.var person var man extend true,person,在工作中,經常需要深拷貝陣列。網路上大部分 都是靠for 迴圈來將值賦給新的array,遇到陣列中有objec還需要又for in一次,將屬性賦值新...

python 深淺拷貝總結

賦值 就類似於兩個標籤貼到同一記憶體位址上,源資料型別改,賦值的型別也改 淺拷貝 外邊的殼記憶體位址永遠不一樣,他只拷貝了元素第一層的位址,只有 修改 拷貝資料的第一層的時候 源資料不改變,給可變資料型別進行新增的時候源資料會受到影響。可變資料型別能夠新增和修改,不可變資料型別只能修改 第二層 可變...