3 个回答

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 循环中:

  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;
    };
  }
}
你知道吗?

宣传栏