Cでは、真であるとわかっています。偽は、それぞれ1と0に評価されます。この場合はshow
が画面に表示されます...ここで何が起こっているのかわかりません。私はtrue
を返すことを期待しています。この1
は私のカルマを台無しにしています。なぜ(true && 1)は1を返しますが、(1 && true)がtrueを返しますか?
show(1 && true);
true
show(true && 1);
1
Cでは、真であるとわかっています。偽は、それぞれ1と0に評価されます。この場合はshow
が画面に表示されます...ここで何が起こっているのかわかりません。私はtrue
を返すことを期待しています。この1
は私のカルマを台無しにしています。なぜ(true && 1)は1を返しますが、(1 && true)がtrueを返しますか?
show(1 && true);
true
show(true && 1);
1
簡単に言えば、&&
が定義されています。 Javascriptでは、a && b
はa
を返します。a
が偽であればb
の場合a
が真実です。
逆a || b
戻りa
a
が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コミュニティのどの部分から来ているのかは、間違いなく簡潔です。このような例のため、本質的には真実の値が偽の値よりはるかに多様であるという事実のために、短絡||
を使用することは短絡よりもはるかに一般的です&&
、あなたの質問のように。
それは素晴らしい答えです。ありがとう。 –
Javascriptで&& ||を使用するのはかなり一般的ですか?単純なif文のための規則?私はそれがいかに簡潔であるか好きです。 –
@KeithGrout私が与えた両方の例は、私の会社の生産コードで使用されています。それは間違いなく簡潔で「賢明」であり、判読不能であるが、多くの人々がそれを共通のパターンとして受け入れる。それはあなたの判断です。 – djechlin
この種の動作は、ブール値のコンテキスト(Javascript、Python、Luaなど)で任意の値を使用できるようにする動的言語ではよくあることを指摘したいと思います。 Cは別のブール型を持たないので、奇妙なコーナーケースでもあります。したがって、ミックスはintを使用します。 – hugomg