[英]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:
我可以使用解決方法分別復制數組的每個部分而不是一次復制,但我仍然想了解為什么會發生這種情況。
取自這里 :
對於對象引用(而不是實際對象),slice將對象引用復制到新數組中。 原始數組和新數組都引用相同的對象。 如果引用的對象發生更改,則更改對新的和原始數組都可見。
我的猜測是,由於你的數組包含數組數組,它們可能被表示為對象引用; 因此, slice
正在復制引用,而不是對象。 它只做淺拷貝,而不是深拷貝。 如果數組中的項不是對象,則不會遇到此問題。
這是預期的行為。 看看文檔 。 您只獲得原始數組的淺表副本:
slice()方法將數組的一部分的淺表副本返回到新的數組對象中。
對於數組,存儲對象引用,因此只復制引用。 對於String,您將不會觀察到此行為。
對於對象引用(而不是實際對象),slice將對象引用復制到新數組中。 原始數組和新數組都引用相同的對象。 如果引用的對象發生更改,則更改對新的和原始數組都可見。
對於字符串和數字(不是String和Number對象),slice將字符串和數字復制到新數組中。 對一個數組中的字符串或數字的更改不會影響另一個數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.