【问题标题】:operator += producing unexpected result javascript运算符 += 产生意外结果 javascript
【发布时间】:2017-05-27 21:06:05
【问题描述】:

function range(start, end, st) {
  var arr = [];
  var counter = start;
  while (counter <= end) {
    arr.push(counter);
    counter += st || counter + 1;

  }
  return arr;
}

console.log(range(1, 10));

这会产生意想不到的结果

但是这个:

counter = counter + st || counter + 1;

产生预期的结果 知道为什么吗?

【问题讨论】:

标签: javascript logical-operators


【解决方案1】:

我不确定你希望代码做什么,但counter += st || counter + 1 相当于

counter += (st || (counter + 1));

相当于

if(st) {
    counter = counter + st;
}
else {
    counter = counter + counter + 1;
}

另一方面,counter = counter + st || counter + 1 等价于

counter = (counter + st ) || (counter + 1);

相当于

if(counter + st) {
    counter = counter + st;
}
else {
    counter = counter + 1;
}

所以他们做的事情完全不同。我认为运算符优先级会让你失望。

【讨论】:

    【解决方案2】:

    区别在于

    counter += st || counter + 1;
    

    意思相同

    counter = counter + (st || counter + 1);
    

    counter = counter + st || counter + 1 表示counter = (counter + st) || (counter + 1)


    在您的示例代码中,stundefined,因此循环有效

    counter += counter + 1;
    

    每次,相当于

    counter = counter * 2 + 1;
    

    因此大跳跃。


    另一方面,在

    counter = counter + st || counter + 1;
    

    stundefined 意味着counter + stNaN,这算作假,所以这有效地运行

    counter = counter + 1;
    

    相当于

    counter += 1;
    

    但是,这只是偶然的。如果您使用不同的参数调用您的函数,例如:

    function range(start, end, st) {
      var arr = [];
      var counter = start;
      while (counter <= end) {
        arr.push(counter);
        counter = counter + st || counter + 1;
      }
      return arr;
    }
    
    console.log(range(-2, 2, 2));

    结果是[ -2, -1, 1 ],而不是预期的[ -2, 0, 2 ]


    您可以通过以下方式修复您的代码

    counter += st || 1;
    

    改为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 2017-07-05
      • 2022-01-11
      相关资源
      最近更新 更多