2017-05-27 41 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

希望我能說清楚!乾杯!