web-dev-qa-db-ja.com

なぜ論理演算子(&&と||)は常にブール結果を返さないのですか?

これらの論理演算子がブール値ではなくオブジェクトを返すのはなぜですか?

_var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );

var _ = obj && obj._;
_

なぜそれがobj.fn()(定義されている場合)の結果を返すのかを理解したいOR _obj.__がブール結果ではない。

48
theateist
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false 

ブール値を返します。

[〜#〜]更新[〜#〜]

これは私のテストに基づいていることに注意してください。私は完全に信頼されるべきではありません。

nottrueまたはfalseの値を割り当てる式です。むしろ、計算された値を割り当てます。

この式を見てみましょう。

式の例:

var a = 1 || 2;
// a = 1

// it's because a will take the value (which is not null) from left
var a = 0 || 2;
// so for this a=2; //its because the closest is 2 (which is not null)

var a = 0 || 2 || 1;    //here also a = 2;

あなたの表現:

var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );

// _ = closest of the expression which is not null
// in your case it must be (obj.fn && obj.fn())
// so you are gettig this

別の表現:

var a = 1 && 2;
// a = 2

var a = 1 && 2 && 3;
// a = 3 //for && operator it will take the fartest value
// as long as every expression is true

var a = 0 && 2 && 3;
// a = 0

別の表現:

var _ = obj && obj._;

// _ = obj._
17
Santosh Linkha

JavaScriptでは、||&&はどちらも、左から右に評価すると最初に完全に決定された「論理値」を返す論理的な短絡演算子です。

X || Yでは、Xが最初に評価され、ブール値として解釈されます。このブール値が「true」の場合、それが返されます。そして、Yは評価されません。 (YがtrueであるかYがfalseであるかは関係ないため、X || Yは完全に決定されています。)これが短絡部分です。

このブール値が「false」の場合、Yを評価してブール値として解釈するまで、X || Yがtrueかfalseかはまだわかりません。したがって、Yが返されます。

また、&&も同じことを行いますが、最初の引数がfalseの場合は評価を停止します。

最初のトリッキーな部分は、式が「true」と評価されると、式自体が返されることです。これは論理式では「真」と見なされますが、使用することもできます。これが、実際の値が返されている理由です。

2番目のトリッキーな部分は、式が「false」と評価された場合、JS 1.0および1.1ではシステムがブール値「false」を返すことです。一方、JS 1.2では、式の実際の値を返します。

JSではfalse0-0""nullundefinedNaNおよびdocument.all all falseとしてカウント

ここではもちろん、議論のために論理値を引用しています。もちろん、リテラル文字列"false"は値falseと同じではないため、trueです。

66
DragonLord

最も簡単な言葉で:

||演算子は最初の真の値を返し、真の値がない場合は最後の値(偽の値)を返します。

&&演算子は最初の偽の値を返します。偽でないものがあれば、最後の値(真の値)を返します。

とても簡単です。コンソールで実験して、自分の目で確かめてください。

"" && "Dog"    // ""
"Cat" && "Dog" // "Dog"
"" || "Dog"    // "Dog"
"Cat" || "Dog" // "Cat"
55
Sam Eaton

ここで基本的なJavaScript方法論の質問があると思います。

現在、JavaScriptは緩やかに型付けされた言語です。そのため、論理演算を処理する方法と方法は、JavaおよびC++のような他の標準言語のものとは異なります。JavaScriptは、「型強制」と呼ばれる概念を使用して、論理演算を実行し、常に最初のtrueタイプの値を返します。たとえば、次のコードを見てください。

var x = mystuff || document;
// after execution of the line above, x = document

これは、mystuff先験的未定義のエンティティであるため、テスト時に常にfalseと評価されるため、JavaScriptはこれをスキップして、true値の次のエンティティをテストします。ドキュメントオブジェクトはJavaScriptに認識されているため、true値を返し、JavaScriptはこのオブジェクトを返します。

ブール値を返したい場合は、論理条件ステートメントを次のような関数に渡す必要があります。

var condition1 = mystuff || document;

function returnBool(cond){
  if(typeof(cond) != 'boolean'){ //the condition type will return 'object' in this case
     return new Boolean(cond).valueOf();
  }else{ return; }
}    
// Then we test...
var condition2 = returnBool(condition1);
window.console.log(typeof(condition2)); // outputs 'boolean' 
3

以下のJSの仕様(11.11)を参照できます。

意味論

プロダクションLogicalANDExpression:LogicalANDExpression && BitwiseORExpressionは、次のように評価されます。

  1. LogicalANDExpressionを評価します。

2.GetValue(Result(1))を呼び出します。

3. ToBoolean(Result(2))を呼び出します。

4.Result(3)がfalseの場合、Result(2)を返します。

5. BitwiseORExpressionを評価します。

6.GetValue(Result(5))を呼び出します。

7.Return Result(6)。

仕様については こちら を参照してください

2
IcyBrk

ほとんどのプログラミング言語では、_&&_および_||_演算子はブール値を返します。 JavaScriptでは異なります


OR演算子:

最初のオペランドの値を返します(有効な場合)、そうでない場合は最後のオペランド( falseとして検証された場合でも)

例1:

_var a = 0 || 1 || 2 || 3;
        ^    ^    ^    ^
        f    t    t    t
             ^
             first operand that validates as true
             so, a = 1
_

例2:

_var a = 0 || false || null || '';
        ^    ^        ^       ^
        f    f        f       f
                              ^
                              no operand validates as true,
                              so, a = ''
_

AND演算子:

最後のオペランドの値を返します(すべての条件がtrueとして検証された場合)、そうでない場合は最初のオペランドの値が返されます) falseとして検証されます

例1:

_var a = 1 && 2 && 3 && 4;
        ^    ^    ^    ^
        t    t    t    t
                       ^
                       last operand that validates as true
                       so, a = 4
_

例2:

_var a = 2 && '' && 3 && null;
        ^    ^     ^    ^
        t    f     t    f
             ^
             entire condition is false, so return first operand that validates as false,
             so, a = ''
_

結論:

JavaScriptが他のプログラミング言語と同じように動作するようにするには、次のようにBoolean()関数を使用します。

_var a = Boolean(1 || 2 || 3);// a = true
_
2
evilReiko

最初に、それが戻ることは真でなければならないので、あなたが真実性をテストしているなら、それは違いがありません

次に、次のように割り当てを行うことができます。

function bar(foo) {
    foo = foo || "default value";
1
Quentin

比較:

var prop;
if (obj.value) {prop=obj.value;}
else prop=0;

と:

var prop=obj.value||0;

真または偽だけでなく真実な式を返すと、通常はコードが短くなり、読みやすくなります。これは||では非常に一般的ですが、&&ではそれほど多くありません。

1
Christophe

短絡演算子は、論理演算子よりもconditionals評価者と考える必要があります。

x || yおおまかに対応します。

if (x) { return x } else { return y; }  

およびx && yおおまかに対応します。

if (x) { return y } else { return x; }  

これを考えると、結果は完全に理解できます。

0
JacquesB