2017-10-23 2 views
2
if (!5%5) { 
    console.log('its a 5%!'); 
} 

if (5%5 === 0) { 
    console.log('its a 5%! but eval differently'); 
} 

https://codepen.io/adamchenwei/pen/ZXNraK?editors=0010なぜゼロのMOD(%)の計算結果は

javascriptの条件評価のようfalsyあなたが唯一の真実であることを評価するために、第二の文が表示されます上記のような何かを考えていないだろう。何故ですか?最初のステートメントではない!は、すでに値をtrueに戻すのに役立ちます。私は何を逃したのですか?

+3

ヒント:ここでの挙動を理解するのお手伝いをすべきいくつかの行であり、 US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)。 – tadman

+0

今はそんなに愚かな気がする。 – Ezeewei

+1

私たちの最高のことが起こる。このような奇妙なことが起きた場合は、特定の順序の評価を強制するために部品の周りに '(...) 'を適用することを学んだことを願ってください。 – tadman

答えて

3

!5%5は、かっこ付きであるかのように解釈されます。(!5)%5。つまり、!演算子は非常にきつくバインドします。したがって、!5の前に評価され、%演算子の前に評価されます。

-x+yのような式を考えます。明らかに、これは、従来の算術演算子の優先順位ルールのために、(-x)+yを意味し、-(x+y)ではありません。 !演算子は、その点で単項式-に似ています。

表現!50あり、そして0%5は0であるので、!5%5は "truthy" ではありません。

4

!5は、0です。

0 % 5は偽です。

したがって、ifはトリガーしません。

0

5%5の結果は数字ではないため(NaN)、それを反転することはできません。しかし、この結果を変数に格納したり、5%5をカッコで囲むと(実行順序が変わります)、試したとおりに使用することができます。 [演算子の優先順位](https://developer.mozilla.org/en-上に読む時間:

var result = 5%5; 
 

 
if (!result) { 
 
    console.log('Works with variable'); 
 
} 
 

 
if (!5%5) { 
 
    console.log('Works without variable'); 
 
} else { 
 
    console.log('!5%5 evaluates to "!NaN"'); 
 
} 
 

 
if (!(5%5)) { 
 
    console.log('!(5%5) works with parentheses'); 
 
} else { 
 
    console.log('!(5%5) doesn\'t work'); 
 
} 
 

 
console.log("The type of 5%5 is: ", typeof 5%5); 
 
console.log("The type of (5%5) is: ", typeof (5%5)); 
 
console.log("The type of 5%5 stored in variable is: ", typeof result); 
 
console.log("The type of !(5%5) is: ", typeof !(5%5));

+0

「5%5」は間違いなく数字です。具体的には「0」である。 – Pointy

+0

@Pointy、なぜ 'console.log(typeof 5%5);'は 'NaN'ですか? –

+0

'typeof 5%5'は'(typeof 5)%5'と解釈されるので – Pointy