首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >forEach循环中的JS - filter v.s.拼接

forEach循环中的JS - filter v.s.拼接
EN

Stack Overflow用户
提问于 2021-07-29 16:28:30
回答 1查看 615关注 0票数 0

背景知识

我们可以使用splicefilter来变异数组。filter不是可变方法,但splice是可变方法。因此,如果我们对一个数组使用splice,那么原始数组就会发生变异。

问题所在

现在,我们将对数组执行forEach,如果条件匹配,我们将使用splicefilter删除一个元素。让我们看看:

1. splice

代码语言:javascript
运行
复制
let arr = [1, 2, 3, 4];

arr.forEach(el => {
  console.log(el);
  
  if (el === 2) {
    arr.splice(el, 1); // remove element 2
  }
});

是的,这就是我们所期望的。打印1, 2, 4。因为在循环的中间,我们变异了arr,结果就坏了。

2. filter

代码语言:javascript
运行
复制
let arr = [1,2,3,4];

arr.forEach(el => {
  console.log(el);

  if (el === 2) {
    arr = arr.filter(el => el !== 2); // remove element 2
  }
});

但是,正如您所看到的,即使我们在循环中间变异了1, 2, 3, 4,也会打印arr

问题是

我们在循环中间以类似的方式变异了两个数组,但是结果是不同的!发生了什么?

为什么splice会影响原始数组,而不影响filter

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 16:35:14

这就是定义Array.prototype.spliceArray.prototype.filterArray.prototype.forEach的简单方法。splice用于修改数组(并返回已删除的值),而filter则用于返回数组的副本,其中仅包含匹配的值。

Array.prototype.forEach按升序遍历数组。即使您在例如索引3期间修改了数组,但是下一次迭代只会转到下一个索引,例如4,除非数组的末尾已经到达。请注意,一旦在数组上调用了.forEach,它就会继续处理该数组。将arr设置为另一个值不会影响数组或.forEach调用的状态。类似于常规函数调用:

代码语言:javascript
运行
复制
let someVariable = 5;
function test(param) {
    someVariable = 6;
    console.log(param); // still prints 5
}
test(someVariable);

毕竟,JavaScript通过引用(或原语值)工作,而不是像在其他语言中那样传递指向someVariable变量的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68579693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档