52

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

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

var _ = obj && obj._;

obj.fn()(定義されている場合)ORの結果を返すobj._が、ブール結果を返さない理由を理解したい。

4

9 に答える 9

74

JavaScript では、 と は両方とも||論理&&短絡演算子であり、左から右に評価されたときに最初の完全に決定された「論理値」を返します。

X || Yでは、Xが最初に評価され、ブール値として解釈されます。このブール値が「true」の場合、それが返されます。そしてY評価されない。Y(真かY偽かは問題ではないので、X || Y完全に決まっています。) そこが短絡部分です。

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

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

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

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

JSfalseでは、、、、、、およびすべてfalse0としてカウントされます。-0""nullundefinedNaNdocument.all

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

于 2011-12-20T02:02:12.773 に答える
69

簡単に言えば:

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

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

それは本当に簡単です。コンソールで実験して、自分の目で確かめてください。

console.log("" && "Dog");    // ""
console.log("Cat" && "Dog"); // "Dog"
console.log("" || "Dog");    // "Dog"
console.log("Cat" || "Dog"); // "Cat"

于 2015-08-22T17:30:31.267 に答える
18
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false 

ブール値を返します。

アップデート

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

代入も価値もない表現です。むしろ、計算された値を割り当てます。truefalse

この表現を見てみましょう。

式の例:

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._
于 2011-03-24T10:53:58.367 に答える
2

ここでJSのspec(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.結果(6)を返します。

仕様についてはこちらをご覧ください

于 2013-01-11T18:45:38.133 に答える
1

比較:

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

と:

var prop=obj.value||0;

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

于 2013-01-11T19:07:40.503 に答える
1

まず、返されるには true でなければならないため、真実性をテストしている場合は違いはありません

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

function bar(foo) {
    foo = foo || "default value";
于 2011-03-24T10:52:01.377 に答える