【问题标题】:Weird issue with slice() when copying an array复制数组时 slice() 的奇怪问题
【发布时间】:2014-03-03 12:00:51
【问题描述】:

我有一个“空”数组,稍后将在代码中填充数据。但在它到达那个阶段之前,有一个部分会将默认内容复制到一个临时数组中,因此可以更改原始内容并稍后接收存储在副本中的相关数据。

问题是当我使用 slice 并删除原始数组中的部分时,临时部分也会受到影响。

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/

我可以使用解决方法单独复制数组的每个部分,而不是一次全部复制,但我仍然想了解为什么会发生这种情况。

【问题讨论】:

    标签: javascript arrays multidimensional-array slice


    【解决方案1】:

    这是预期的行为。看看documentation。 您只会得到原始数组的浅层副本:

    slice() 方法将数组的一部分的浅拷贝返回到新的数组对象中。

    对于数组,对象引用被存储,所以只有引用被复制。对于字符串,您不会观察到这种行为。

    对于对象引用(而不是实际对象),切片将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则更改对新数组和原始数组均可见。

    对于字符串和数字(​​不是字符串和数字对象),切片将字符串和数字复制到新数组中。更改一个数组中的字符串或数字不会影响另一个数组。

    【讨论】:

      【解决方案2】:

      取自here

      对于对象引用(而不是实际对象),切片复制对象 对新数组的引用。原始数组和新数组都引用 到同一个对象。如果引用的对象发生更改,则更改为 对新数组和原始数组都可见。

      我的猜测是,由于您的数组包含数组数组,它​​们可能被表示为对象引用;因此,slice 正在复制引用,而不是对象。它只做浅拷贝,不做深拷贝。如果数组中的项不是对象,则不会遇到此问题。

      【讨论】:

        猜你喜欢
        • 2019-10-10
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多