array.splice的意外结果
Unexpected result from array.splice
我创建了一个JavaScript函数来删除数组中的项并返回最后一项。然而,这实际上是从主数组中删除了不应该删除的项。
功能:
function oneRemaining(arr) {
tmp = arr;
while (tmp.length > 1) {
tmp.splice(~~(Math.random() * tmp.length), 1);
}
return tmp[0];
}
所以在运行这个之后,进入的数组应该还是一样的因为它从来没有改变过但是当我在控制台中运行这个时,只有一个元素在里面
为什么输入数组被改变?
你的数组改变了,因为:
- 你创建了一个引用,而不是克隆/副本(你在最后触摸相同的数组)
- Splice改变底层数组,这是为数不多的这样做的方法之一(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
如果你想让它工作,把第二行替换为:
tmp = arr.concat([])
它被改变了,因为tmp
是arr
的引用而不是它的副本。当你改变被引用对象中的某些内容时它也会随之改变
数组在javascript中是引用类型,所以下面一行不复制输入数组,它只是用输入数组的引用赋值变量tmp。最后你总是在内存中编辑同一个数组。
tmp = arr;
你可以使用arr.slice(0)来真正复制你的输入数组。
(您可能在变量tmp的声明中遗漏了一个var,除非您希望它是全局的?)
相关文章:
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 逻辑和/或运算符-意外的最终结果
- Javascript:函数返回意外结果
- 意外结果,在 ASP.Net 中解析 JSON 对象的数组
- 按位或意外结果
- 来自 JavaScript 循环的意外结果
- 从 JavaScript 中的图像中读取像素数据会返回半透明像素的意外结果
- 在 JS 中短路空数组会产生意外结果:“[] ||真 == []'
- NodeJS中的Parse Json文件在Node中显示意外结果
- 做了一个javascript小实验,需要你的帮助才能理解意外的结果
- 基于给出意外结果的提示输入的逻辑
- JavaScript Regexp.test返回意外结果
- 推入数组会产生意外的结果
- 键控产生意外结果.HTML5游戏
- Javascript do/while循环显示意外结果
- 来自 CSS 和 jQuery 的意外结果
- MongoDB mapReduce方法意外结果
- 具有意外结果的 Javascript 函数参数
- 如何在集合中的项上触发 jQuery 事件(意外的 jQuery 结果来自 $._data() 与集合的第一个元素)
- 在 JavaScript 中解析日期字符串的意外结果