在我们印象中,forEach和for循环是可以替换的,但是为啥下面的代码运行结果不一样?

发布于 2022-09-13 00:07:48 字数 59 浏览 7 评论 0

图片.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

捂风挽笑 2022-09-20 00:07:48

for 循环里if每次取出最新的scource[i]比较
forEach循环虽然改了原数组, 但是参数i没有变化

source.forEach((i,d)=>{
    val.forEach((j,f)=>{
        if(source[d]===val[f]){
            source[d]=source[d]*2;
        }
    })
})

这样才会有一样的结果

煞人兵器 2022-09-20 00:07:48

他俩肯定不一样,不然为啥出两个,包括那么多的循环api,某些情况下有些问题他们都可以解决,但是本质上还是不同的。

比如你这里,forEach它里面的回调中的变量i和真正的数组元素,这是两个变量的问题,就像下面代码一样

var a = 1
var b = a
b = 3

此时更改b的值,不代表a就要更改

孤星 2022-09-20 00:07:48

for 循环中:

  1. i = 1, j = 0 的时候,source[i] === val[0],满足条件,source[1] *= 2,此时 source[1] = 4;
  2. 接下来是 i = 1, j = 1,由于 source[1] 变成 4 了,恰好又与 val[1] 相等,于是 source[1] 再次被乘以 2。

这是一个挺有意思的 Bug,如果你把 val 里两个数的顺序调换一下就不会出问题了。

解决此 Bug ,可以先把值取出来,避免在下一次内层循环中拿修改后的值再去作比较:

for(var i = 0; i < source.length; i++){
  var sourceI = source[i];
  for(var j = 0; j < val.length; j++){
    if(sourceI === val[j]) source[i] *= 2;
  }
}

还可以优化一下,在完成操作之后结束本次内层循环

for(var i = 0; i < source.length; i++){
  var sourceI = source[i];
  for(var j = 0; j < val.length; j++){
    if(sourceI === val[j]){
      source[i] *= 2;
      break;
    };
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文