array.splice的意外结果

时间:2014-07-06 13:58:59

标签: javascript arrays

我创建了一个JavaScript函数来删除数组中的项并返回最终项。然而,这实际上是在不应该从主数组中删除项目时。

功能:

function oneRemaining(arr) {
    tmp = arr;
    while (tmp.length > 1) {
        tmp.splice(~~(Math.random() * tmp.length), 1);
    }
    return tmp[0];
}

所以在运行之后,进入的数组应该仍然是相同的,因为它从未被改变,但是当我在控制台中运行时,只有1个项目。

为什么输入数组会被改变?

3 个答案:

答案 0 :(得分:1)

您的数组更改是因为:

  1. 您创建了一个引用而不是克隆/副本(最后触摸的是同一个数组)
  2. Splice更改了底层数组,这是为数不多的方法之一(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
  3. 如果您希望这样做,请替换第二行:

    tmp = arr.concat([])
    

    希望这有帮助。

答案 1 :(得分:1)

它被改变了,因为tmp是对arr的引用而不是它的副本。无论何时更改引用对象中的某些内容,它都会更改原始内容

答案 2 :(得分:0)

数组是javascript中的引用类型,因此以下行不复制输入数组,它只是将变量tmp与输入数组的引用一起赋值。最后,您始终在内存中编辑相同的数组。

tmp = arr;

您可以使用arr.slice(0)来真正复制输入数组。

(你可能错过了变量tmp声明中的var,除非你想让它变成全局变量?)