for 循环里if每次取出最新的scource[i]比较forEach循环虽然改了原数组, 但是参数i没有变化
source.forEach((i,d)=>{ val.forEach((j,f)=>{ if(source[d]===val[f]){ source[d]=source[d]*2; } }) })
这样才会有一样的结果
他俩肯定不一样,不然为啥出两个,包括那么多的循环api,某些情况下有些问题他们都可以解决,但是本质上还是不同的。
比如你这里,forEach它里面的回调中的变量i和真正的数组元素,这是两个变量的问题,就像下面代码一样
var a = 1 var b = a b = 3
此时更改b的值,不代表a就要更改
在 for 循环中:
for
i = 1, j = 0
source[i] === val[0]
source[1] *= 2
source[1]
i = 1, j = 1
val[1]
这是一个挺有意思的 Bug,如果你把 val 里两个数的顺序调换一下就不会出问题了。
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; }; } }
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(3)
for 循环里if每次取出最新的scource[i]比较
forEach循环虽然改了原数组, 但是参数i没有变化
这样才会有一样的结果
他俩肯定不一样,不然为啥出两个,包括那么多的循环api,某些情况下有些问题他们都可以解决,但是本质上还是不同的。
比如你这里,forEach它里面的回调中的变量i和真正的数组元素,这是两个变量的问题,就像下面代码一样
此时更改b的值,不代表a就要更改
在
for
循环中:i = 1, j = 0
的时候,source[i] === val[0]
,满足条件,source[1] *= 2
,此时source[1]
= 4;i = 1, j = 1
,由于source[1]
变成 4 了,恰好又与val[1]
相等,于是source[1]
再次被乘以 2。这是一个挺有意思的
Bug
,如果你把val
里两个数的顺序调换一下就不会出问题了。解决此
Bug
,可以先把值取出来,避免在下一次内层循环中拿修改后的值再去作比较:还可以优化一下,在完成操作之后结束本次内层循环