Javascript array.splice产生意外结果
我创建了一个JavaScript函数来删除数组中的项并返回最后一项。然而,这实际上是从主数组中删除不应该删除的项 功能: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]; } 所以在运行这个之后,进入的数组应该仍然是相同的,因为它从来没
function oneRemaining(arr) {
tmp = arr;
while (tmp.length > 1) {
tmp.splice(~~(Math.random() * tmp.length), 1);
}
return tmp[0];
}
所以在运行这个之后,进入的数组应该仍然是相同的,因为它从来没有被改变过。然而,当我在控制台中运行这个时,其中只有一项
为什么要更改输入数组?您的数组更改是因为:
tmp = arr.concat([])
希望这有帮助。它正在被修改,因为
tmp
是对arr
的引用,而不是它的副本。无论何时更改引用对象中的某个内容,它都会更改原始数组以及javascript中的引用类型,因此下一行不复制输入数组,而只是使用输入数组的引用分配变量tmp。最后,您总是在内存中编辑相同的数组
tmp = arr;
您可以使用arr.slice(0)来真正复制输入数组
(您可能在变量tmp声明的from中漏掉了一个var,除非您希望它是全局的?@它没有得到数组的最后一个元素。它将在删除其他元素后获取剩余的最后一个元素。在我看来,这比在数组中选择一个随机元素更随机(
arr[~(Math.random()*arr.length)]
)哦,天哪,我患上了隧道视力。我是根据“返回最终项目”一文发表评论的。当然,当时我的评论毫无意义。