(myVar && foo())
上記のコードはどういう意味ですか?それは何に相当しますか?
私はそれが単一の行で実行されると思います。
(myVar && foo())
上記のコードはどういう意味ですか?それは何に相当しますか?
私はそれが単一の行で実行されると思います。
myvar
式は、 ifmyvar
が偽であり、foo()
ifが真であると評価されmyvar
ます。次のスニペットはほぼ同じです。
var x = (myvar && foo());
if(myvar){ var x = foo(); } else { var x = myvar; }
これは、「myVarがfalseでない場合は、関数foo()を実行する」と同等の式です。次のように使用var x = (myVar && foo())
すると、結果は次のようになります。
myVarがfalseでない場合、xはfoo()の出力に設定されます。myVarがfalseの場合、xはmyVarの値に設定されます。
foo()関数は、myVarがfalseyでない場合にのみ呼び出されます。つまり、false、 ""、0、null、またはundefinedにすることはできません。(他のもの?)
次のような例を見るのがより一般的です。
window.console && console.log("some helpful debug info");
これは次のように解釈されます...
「'window'変数に'console'というメンバーがある場合...」
(コンソールが未定義の場合、falseではなくJavaScriptエラーが発生するため、「console」の前に「window」を付けることが重要です。)
"...'console'オブジェクトの'log'メソッドを呼び出します。"
この式は、ブール式の短絡を巧みに利用しています。foo()は、myVarが。と評価された場合にのみ実行されtrue
ます。
if (myVar) {
foo();
}
はるかに明確です。この種のコードが理にかなっている場合もあるでしょうが、スタイルチェッカー(この種のことに興味がある場合)はそれに適合します。http://javascript.crockford.com/code.htmlを参照してください。セミコロンの挿入と式のステートメントに依存しないようにすることをお勧めします。
編集:var x = a && b();
特定の状況ではおそらくそれほど悪い考えではないことに注意してください。しかし、(a && b())
それ自体はいくつかの点で間違っています。(セミコロンの挿入、式のステートメント、意味的に不可解である以外)
&&が評価されると、左側が最初に評価されます。つまりmyVar
、これが当てはまる場合は、右側のみが評価されfoo()
ます。これは、ステートメントA && BでAがfalseの場合、式A&&Bは常にfalseと評価されるためです。
上記のステートメントは通常、次のように使用されます。
var x = myVar && foo();
これは次のように書くこともできます:
if myVar is truee x = foo(), else x = false