2016-04-12 6 views
0

私はEloquent JavaScriptからこのコードを理解しようとしています:(!n%2)は(!n%2 == 0)と同じですか?

function unless(test, then) { 
    if (!test) then(); 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    unless(n % 2, function() { 
    console.log(n, "is even"); 
    }); 
}); 
// → 0 is even 
// → 2 is even 

を私は0,1,2と、次のコード3回のテスト実行し、それが言うことを得る:私はドン何

if (!n%2) function(n) { 
    console.log(n, "is even"); 
}); 

」をどうすれば(!n%2)から真偽を得ることができますか?

(!n%2)(!n%2 == 0)と同じですか?

+0

私が知っている限り、javascriptは 'null'でも' undefined'でも評価されない限り、式を真に評価します。言い換えると、javascriptでは* valid/known *値を持つものはすべてtrueと評価されます。 – Veverke

+0

@Veverke - ...または空の文字列、または '0'。 –

+0

条件にできるだけ明示してください。 これらの "トリック"は言語に依存しており、どの言語がどのようにそれらを処理するかを記憶するのに十分な時間はありません。 だから(!n%2)あなたが望むものがあっても。それを使用しないでください。 – dustinroepsch

答えて

0

あなたのテストコードは、記事からのサンプルコードと同等ではありません。

サンプルコードでは、n % 2が最初に評価され、その結果がunless関数に渡されます。そこでは、結果に対して論理Not操作を実行しています。

nが偶数の場合、n % 20からunlessになります。ブール比較0falseを返し、!は結果を否定します(論理はありません)。したがって!0 == trueです。これにより、then関数が起動します。

nが奇数の場合は逆です。 0以外の値が渡され、falseと評価され、thenが発生しません。

これに対して、Higher-Order関数を使用せずにサンプルコードを再現しようとしても、同じ方法では動作しません。 !n % 2は最初にnのLogical Notを実行してから、結果をモジュロしようとします。 !(n % 2)は、サンプルコードのより良い表現です。

+0

私はあなたが何を意味するかを見て、最初のコードの流れを理解できませんでした。私は最初に 'n%2'の結果が最初に何であるかを考え、その結果に'! 'を適用する必要があります。これにより、理解しやすくなりました。 –

1

Logical NOT !は、higher precedencemodulo operator %である。

したがって、(!n%2)は、n = 0を除いて常に虚偽値を0に戻す(!n) % 2に相当します。

一方、(!n%2 == 0)は、true,を除いて)を返します。

どちらも同じではありませんが、実際には互いに反対です(真実の値と真実の値)。

!(n % 2)が必要です。

または番号が一つが偶数であるか奇数であるかを決定するための手段として動作するはずも

n % 2 === 0 
+1

必ずしも '0'を返すとは限りません。 'n = 0'で試してください。 – Bergi

+0

@Bergiありがとう、更新しました。 :) – Tushar

0
!Boolean(n%2)

ある場合、単純にチェックします。

ブール値はBIDMASに従わないことに注意してください。

それは0の数値がfalseとして扱われ、他の数値をtrueとして扱われるようにnをブールとして扱われる最初!nありません。感嘆符は、論理状態nを反転します。

%2バックtrue1であり0false整数にブールに変換します。 !n = 00!n = 11を返します。

if文で!n%2を使用すると、ブール値(、0 = false)に変換されます。

したがって、n = 0の場合、trueが返されたためif文が処理されます。 n != 0!=の意味が等しくない)の場合、falseが返されたため、if文はスキップされます。

0

いいえ、そうではありません。述べたようにhere "!"演算子は "%"よりも高い優先順位を持ちます。したがって、nが0の場合はtrueを返し、nが0の場合はfalseを返します。

さらに詳しくは、nが2であるとします。式の実行は次のとおりです。

(!n)%2 
(!2)%2 
0%2 
0 

ので、それは今のn = 0の

(!0)%2 
1%2 
1 

ので、それが本当である、falseです。 nが0と異なる場合は(!n%2 == 0)の逆の振る舞いです。そうでない場合は、==は優先度が低く、上記の計算の最後に0との比較が実行されるためです。あなたは簡単にn個の異なる値で、この簡単なJavaScriptを使用して自分自身を納得させることができます:あなたが書いた

n = 1; 
    if(!n%2) 
    { 
     document.getElementById("par1").innerHTML="true"; 
    } 
    if(!n%2 == 0) 
    { 
     document.getElementById("par2").innerHTML="true"; 
    } 
関連する問題