Javascript array.splice产生意外结果

Javascript array.splice产生意外结果,javascript,arrays,Javascript,Arrays,我创建了一个JavaScript函数来删除数组中的项并返回最后一项。然而,这实际上是从主数组中删除不应该删除的项 功能: function oneRemaining(arr) { tmp = arr; while (tmp.length > 1) { tmp.splice(~~(Math.random() * tmp.length), 1); } return tmp[0]; } 所以在运行这个之后,进入的数组应该仍然是相同的,因为它从来没

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

功能:

function oneRemaining(arr) {
    tmp = arr;
    while (tmp.length > 1) {
        tmp.splice(~~(Math.random() * tmp.length), 1);
    }
    return tmp[0];
}
所以在运行这个之后,进入的数组应该仍然是相同的,因为它从来没有被改变过。然而,当我在控制台中运行这个时,其中只有一项


为什么要更改输入数组?

您的数组更改是因为:

  • 您创建了一个引用,而不是克隆/副本(您最终接触的是同一个阵列)
  • Splice更改了底层数组,这是为数不多的实现此功能的方法之一()
  • 如果您希望这样做,请更换第二行:

    tmp = arr.concat([])
    

    希望这有帮助。

    它正在被修改,因为
    tmp
    是对
    arr
    的引用,而不是它的副本。无论何时更改引用对象中的某个内容,它都会更改原始数组以及javascript中的引用类型,因此下一行不复制输入数组,而只是使用输入数组的引用分配变量tmp。最后,您总是在内存中编辑相同的数组

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


    (您可能在变量tmp声明的from中漏掉了一个var,除非您希望它是全局的?

    @它没有得到数组的最后一个元素。它将在删除其他元素后获取剩余的最后一个元素。在我看来,这比在数组中选择一个随机元素更随机(
    arr[~(Math.random()*arr.length)]
    )哦,天哪,我患上了隧道视力。我是根据“返回最终项目”一文发表评论的。当然,当时我的评论毫无意义。