operator + =产生意外结果javascript

时间:2017-05-27 21:06:06

标签: javascript logical-operators

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;

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

3 个答案:

答案 0 :(得分:2)

我不确定您希望代码做什么,但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;
}

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

答案 1 :(得分:1)

区别在于

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;

st undefined表示counter + stNaN,计为错误,因此有效运行

counter = counter + 1;

相当于

counter += 1;

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

&#13;
&#13;
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));
&#13;
&#13;
&#13;

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

您可以通过

修复代码
counter += st || 1;

代替。

答案 2 :(得分:0)

在您使用counter = counter + st || counter + 1;的代码示例中,它完全符合编码,counter += st || counter + 1;执行您想要的操作。如果您希望代码中包含较短的表单,则应使用counter += st || 1;,因为这样可确保您不会将counter添加到自身。