2010-12-02 17 views
4

スニペット1:if(x){foo();の違い}とx? foo():0;

if (x) { 
    foo(); 
} 

スニペット2:

x ? foo() : 0; 

これら2つのスニペットとの違いは何ですか?

編集:構文エラーを修正しました。

更新:ところで、それも短い表記があるようです:

x && foo(); 

答えて

1

通常、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() 

を依頼するためのものだと思い

8

スニペット#2、それはそれ三作るために必要な: blahに欠けるため、無効なECMAScript式です。

EDIT: 2つのスニペットとの違いは本当にありませんxがtruthyであれば、彼らは両方のfooを呼び出します。 xが偽(未定義/偽/空文字列/ 0 /)の場合、最初のスニペットは何も評価されず、後者のスニペットは0と評価されますが、0は実際にスクリプトに影響しません。

+0

の戻り値を使用している、ブロック構文は任意の値に評価されないという帰チェックのため& &

var val = obj && obj.getValue(); 

注意を使用して大好きです(それは表現ではない)。三項演算子は値に評価されます。 – cdhowie

+0

@meder質問を更新しました... –

+0

@cdhowie Yeaですが、三項式は自分のコード内の何にも割り当てられていないので、この場合は違いはありません。 –

3

、出力に違いはありません。私は三項演算子を使用するセマンティクスと& &のために、これらのケースでは三項演算子または& &演算子を使用するのは嫌です。三元は、& &の式のように、使用していない値を返します。したがって、私はむしろ言語が使用するオペレータの意図する方法を使用したいと思います。

しかし、私はこのケースでは、我々はまた、表現

+1

+1私はこのテクニックが好きです: 'if(x){foo();}の代わりに' x && foo(); ' } '。私はそれを覚えています。 :) –

+0

確かに...それは私の反感でしたが。私はそれを使用していましたが、仲間の開発者がそれをしないと確信していました。 –

+0

それにかかわらず、それについて知っておくと良いです。 –

関連する問題