2013-11-26 17 views
12

Cでは、真であるとわかっています。偽は、それぞれ1と0に評価されます。この場合はshowが画面に表示されます...ここで何が起こっているのかわかりません。私はtrueを返すことを期待しています。この1は私のカルマを台無しにしています。なぜ(true && 1)は1を返しますが、(1 && true)がtrueを返しますか?

show(1 && true); 
true 



show(true && 1); 
1 
+1

この種の動作は、ブール値のコンテキスト(Javascript、Python、Luaなど)で任意の値を使用できるようにする動的言語ではよくあることを指摘したいと思います。 Cは別のブール型を持たないので、奇妙なコーナーケースでもあります。したがって、ミックスはintを使用します。 – hugomg

答えて

23

簡単に言えば、&&が定義されています。 Javascriptでは、a && baを返します。aが偽であればbの場合aが真実です。

a || b戻りaaがfalsyある場合aはtruthyとbある場合。

これは直感的に意味します。aが偽の場合、a && bで、残りの表現を読むのはどうですか?あなたはすでにすべてが間違っていることを知っています。だから偽を返してください。しかし、Javascriptは、falseをどこにも返さない代わりに、偽物であるaを返すという決定を下します。

これは、すべてのC言語に共通する短絡評価に基づいています。

これは、Javascriptで多くの表現力を可能にします。例えば、このパターンは:

var foo = function(opts) { 
    opts = opts || {} 
    // ... 
} 

オプションパラメータoptsを実装します。 optsがまったく渡されない場合、opts = opts || {}opts{}に設定するので、残りのコードはoptsが渡されなかったことを知る必要はありません。長い手では、次のように相当

されています:

var x = a || b; // is equivalent to 
var x; 
if(a) { 
    x = a; 
} 
else { 
    x = b; 
} 

var y = a && b; // is equivalent to 
var y; 
if(!a) { 
    y = a; 
} 
else { 
    y = b; 
} 

シンプルif文を置き換えることができので、そこでJavascriptが、はるかに簡潔CやJavaよりもすることができます||または&&場合によっては、コードが簡潔で読みにくく、Perlに似ています。それ以外の場合は、opts = opts || {}のような新しいJavascriptパターンが可能です。

別の用途は意味

var displayName = user.fullname || user.email; 

のようなパターンである「利用可能フルネーム場合に使用します。。、電子メールにフォールバックされていない場合」私は個人的にはこれを表現力豊かで読みやすいと思っていますが、Javascriptコミュニティのどの部分から来ているのかは、間違いなく簡潔です。このような例のため、本質的には真実の値が偽の値よりはるかに多様であるという事実のために、短絡||を使用することは短絡よりもはるかに一般的です&&、あなたの質問のように。

+0

それは素晴らしい答えです。ありがとう。 –

+0

Javascriptで&& ||を使用するのはかなり一般的ですか?単純なif文のための規則?私はそれがいかに簡潔であるか好きです。 –

+1

@KeithGrout私が与えた両方の例は、私の会社の生産コードで使用されています。それは間違いなく簡潔で「賢明」であり、判読不能であるが、多くの人々がそれを共通のパターンとして受け入れる。それはあなたの判断です。 – djechlin

関連する問題