【发布时间】:2019-06-02 13:30:51
【问题描述】:
在 nodejs REPL 上,我试图清理定义为 const array = [...] 的数组,但发现使用 array.forEach(() => /pop|shift/()) 不起作用。在这样的表达式之后,数组仍然会在其中保存值。
我很清楚清理数组的更好方法,例如 array.splice(0),但我真的很好奇这种行为似乎违反直觉,至少对我来说是这样。
这是测试:
const a = [1, 2, 3]
a.forEach(() => {
a.shift()
})
console.log(a) // [ 3 ]
const b = [1, 2, 3]
b.forEach(() => {
b.pop()
})
console.log(b) // prints [ 1 ]
注意事项
-
1234563
结果在不同的节点版本和浏览器中是一致的......所以它看起来像是定义良好的行为。
剩余值的数量,仍然在结果数组中的,根据输入数组的长度而变化,似乎是
Math.floor(array.length / 2)剩余的值总是根据所使用的
/pop|shift/方法排序,因此某些调用实际上是在更改输入数组。调用
Array.prototype.forEach(array, fn)也返回相同的结果
【问题讨论】:
-
您从头开始迭代,每次迭代都删除最后一个元素。这意味着您正在向前移动 1,并且每次迭代将长度减少 1。因此,为什么您最终会使用 floor(initialLength / 2) 迭代。
-
我在 Chrome 71 上的输出有点不同:
[5, 6, 7]用于第一个日志,[1, 2, 3]用于第二个 -
@MatthewHerbst 我修复了输入数组!
标签: javascript arrays node.js