在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 ]
注意事项
一开始我使用的是
arr.forEach(() => arr.pop())
,所以我认为其中一个值短路了forEach
,但将lambda包装在body-block{ .. }
中也会产生相同的结果。结果在不同的node版本和浏览器中保持一致,因此似乎这是定义良好的行为。
剩余值的数量,即仍留在结果数组中的值,取决于输入数组的长度,并且似乎是
Math.floor(array.length / 2)
剩余值始终按照使用
/pop|shift/
方法的顺序排序,因此其中一些调用实际上正在更改输入数组。通过调用
Array.prototype.forEach(array, fn)
也可以返回相同的结果。
[5, 6, 7]
,第二个日志是[1, 2, 3]
。 - Matthew Herbstarray.length = 0;
来清空一个数组。 - Bergi