スニペット1:if(x){foo();の違い}とx? foo():0;
if (x) {
foo();
}
スニペット2:
x ? foo() : 0;
これら2つのスニペットとの違いは何ですか?
編集:構文エラーを修正しました。
更新:ところで、それも短い表記があるようです:
x && foo();
スニペット1:if(x){foo();の違い}とx? foo():0;
if (x) {
foo();
}
スニペット2:
x ? foo() : 0;
これら2つのスニペットとの違いは何ですか?
編集:構文エラーを修正しました。
更新:ところで、それも短い表記があるようです:
x && foo();
通常、if
はステートメントです(変数に割り当てることはできません).3進演算子?:
は式に含まれています(変数に割り当てることができる値を生成します)。
また、ブロックif
は文を含むことができ、?:
の要素は式のみを含むことができます。
この例では、?:
の結果を使用しないため、違いはありません。 両方のスニペットは、xが真の値の場合にのみfoo()
を評価します。私はあなたがそれらが書き込まれると、次の
// Why should I use
if (x) {
do();
}
// instead of
x && do();
または
// Why should I use
if (x) {
do();
} else {
dont();
}
//instead of
x ? do() : dont()
を依頼するためのものだと思い
スニペット#2、それはそれ三作るために必要な: blah
に欠けるため、無効なECMAScript式です。
EDIT: 2つのスニペットとの違いは本当にありませんx
がtruthyであれば、彼らは両方のfoo
を呼び出します。 x
が偽(未定義/偽/空文字列/ 0 /)の場合、最初のスニペットは何も評価されず、後者のスニペットは0
と評価されますが、0
は実際にスクリプトに影響しません。
、出力に違いはありません。私は三項演算子を使用するセマンティクスと& &のために、これらのケースでは三項演算子または& &演算子を使用するのは嫌です。三元は、& &の式のように、使用していない値を返します。したがって、私はむしろ言語が使用するオペレータの意図する方法を使用したいと思います。
しかし、私はこのケースでは、我々はまた、表現
+1私はこのテクニックが好きです: 'if(x){foo();}の代わりに' x && foo(); ' } '。私はそれを覚えています。 :) –
確かに...それは私の反感でしたが。私はそれを使用していましたが、仲間の開発者がそれをしないと確信していました。 –
それにかかわらず、それについて知っておくと良いです。 –
の戻り値を使用している、ブロック構文は任意の値に評価されないという帰チェックのため& &
注意を使用して大好きです(それは表現ではない)。三項演算子は値に評価されます。 – cdhowie
@meder質問を更新しました... –
@cdhowie Yeaですが、三項式は自分のコード内の何にも割り当てられていないので、この場合は違いはありません。 –