array.splice的意外结果

Unexpected result from array.splice

本文关键字:结果 意外 splice array      更新时间:2023-09-26

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

功能:

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

所以在运行这个之后,进入的数组应该还是一样的因为它从来没有改变过但是当我在控制台中运行这个时,只有一个元素在里面

为什么输入数组被改变?

你的数组改变了,因为:

  1. 你创建了一个引用,而不是克隆/副本(你在最后触摸相同的数组)
  2. Splice改变底层数组,这是为数不多的这样做的方法之一(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)

如果你想让它工作,把第二行替换为:

tmp = arr.concat([])

它被改变了,因为tmparr的引用而不是它的副本。当你改变被引用对象中的某些内容时它也会随之改变

数组在javascript中是引用类型,所以下面一行不复制输入数组,它只是用输入数组的引用赋值变量tmp。最后你总是在内存中编辑同一个数组。

tmp = arr;

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

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