如何實現數組深拷貝和淺拷貝?

如何實現數組深拷貝和淺拷貝?

1.背景介紹

在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份.

如下代碼,如果只是簡單才用賦值的方法,那么我們只要更改其中的任何一個,然后其他的也會跟著改變,這就導致了問題的發生。

var arr1 = ["red","yellow","black"];

var arr2 = arr1;

arr2[1] = "green";

console.log("數組的原始值:" + arr1 );

console.log("數組的新值:" + arr2);

測試結果如下:

像上面的這種直接賦值的方式就是數組的淺拷貝,淺拷貝改變其中一個數組,另外一個數組也會跟著改變。很多時候,這不是我們想要的。

2.知識剖析

什么是深拷貝和淺拷貝?

slice和concat使用方法

1.什么是深拷貝和淺拷貝?

淺拷貝:復制一份引用,所有引用對象都指向一份數據,并且都可以修改這份數據。

深拷貝(復雜):復制變量值,對于非基本類型的變量,則遞歸至基本類型變量后,再復制。可以使用slice和concat方法。

2.slice和concat使用方法

語法:arrayObject.slice(start,end)

slice() 方法可從已有的數組中返回選定的元素(請注意,該方法并不會修改數組,而是返回一個子數組)。

start:必需。規定從何處開始選取。如果是負數,那么它規定從數組尾部開始算起的位置。也就是說,-1 指最后一個元素,-2指倒數第二個元素,以此類推。

end:可選。規定從何處結束選取。該參數是數組片斷結束處的數組下標。如果沒有指定該參數,那么切分的數組包含從start 到數組結束的所有元素。如果這個參數是負數,那么它規定的是從數組尾部開始算起的元素。

返回值:返回一個新的數組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素(如果 end 未被規定,那么 slice() 方法會選取從 start 到數組結尾的所有元素)。

vararr=newArray(3);

arr[0] ="George";

arr[1] ="John";

arr[2] ="Thomas";

document.write(arr);

document.write(arr.slice(1) );

document.write(arr);

返回結果:George,John,Thomas

? ? ? ? ? ? ? ? ? John,Thomas

? ? ? ? ? ? ? ? ? ?George,John,Thomas

concat() 方法用于連接兩個或多個數組。該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。

語法:arrayObject.concat(arrayX,arrayX,......,arrayX)

返回一個新的數組。該數組是通過把所有 arrayX 參數添加到 arrayObject 中生成的。如果要進行 concat() 操作的參數是數組,那么添加的是數組中的元素,而不是數組。

arrayX:必需。該參數可以是具體的值,也可以是數組對象。可以是任意多個。

vara= [1,2,3];

document.write(a.concat(4,5));//返回值:1,2,3,4,5

3.常見問題

jquery如何實現深拷貝?

4.解決方案

jQuery.extend()

var arr = [['a','b'],0,1,2,{name:'old'}];

var newArr = $.extend(true, [], arr);

newArr[4].name = 'new';

newArr[0].push('c');

console.log(newArr);

console.log(arr);

5.參考文獻

JavaScript數組深拷貝和淺拷貝的兩種方法

鳴謝

感謝大家觀看

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容