2017-05-27 42 views
0

运营商+ =产生意外结果的JavaScript

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; 

产生预期的结果 任何想法,为什么?

+0

可能会有所帮助,如果你展示了它给你什么与你期望的结果 –

+1

因为_operator precedence_。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – CBroe

+0

@CrayonViolent它假设没有提供'st'因为它将被undefined添加1来计数 – yokimoto

回答

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; 
} 

所以他们做了很不同的事情。我假设运营商的优先级正在抛弃你。

1

所不同的是

counter += st || counter + 1; 

装置相同

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

counter = counter + st || counter + 1装置counter = (counter + st) || (counter + 1)


在您的示例代码stundefined,所以每一次,这相当于

counter = counter * 2 + 1; 

因此,大跳过循环实际上确实

counter += counter + 1; 


在另一方面,在

counter = counter + st || counter + 1; 

stundefined装置counter + stNaN,该计数为假,因此这有效地运行

​​

这相当于

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; 

,而不是解决您的代码。

0

它确实是什么编码,counter = counter + st || counter + 1;做你想做的,在你的代码示例中使用counter += st || counter + 1;。如果你想在你的代码中使用较短的表格,你应该使用counter += st || 1;,因为这样可以确保你不会自己添加counter

希望我能说清楚!干杯!