簡體   English   中英

復制數組時slice()的奇怪問題

[英]Weird issue with slice() when copying an array

我有一個“空”數組,稍后將在代碼中填充數據。 但是在它到達那個階段之前,有一個部分將默認內容復制到臨時數組,因此可以更改原始內容,然后接收存儲在副本中的相關數據。

問題是當我使用切片並刪除原始數組中的部分時,臨時的部分也會受到影響。

var array1 = [["text", [[[1,2],[3,4],[5,6]]], 0]];
var array2 = array1[0].slice(0);

//alert(array2[1][0]) // Output: 1,2,3,4,5,6
array1[0][1][0] = new Array();
//alert(array2[1][0]) // Output:

http://jsfiddle.net/Mbv6j/4/

我可以使用解決方法分別復制數組的每個部分而不是一次復制,但我仍然想了解為什么會發生這種情況。

取自這里

對於對象引用(而不是實際對象),slice將對象引用復制到新數組中。 原始數組和新數組都引用相同的對象。 如果引用的對象發生更改,則更改對新的和原始數組都可見。

我的猜測是,由於你的數組包含數組數組,它​​們可能被表示為對象引用; 因此, slice正在復制引用,而不是對象。 它只做淺拷貝,而不是深拷貝。 如果數組中的項不是對象,則不會遇到此問題。

這是預期的行為。 看看文檔 您只獲得原始數組的淺表副本:

slice()方法將數組的一部分的淺表副本返回到新的數組對象中。

對於數組,存儲對象引用,因此只復制引用。 對於String,您將不會觀察到此行為。

對於對象引用(而不是實際對象),slice將對象引用復制到新數組中。 原始數組和新數組都引用相同的對象。 如果引用的對象發生更改,則更改對新的和原始數組都可見。

對於字符串和數字(​​不是String和Number對象),slice將字符串和數字復制到新數組中。 對一個數組中的字符串或數字的更改不會影響另一個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM