これらの論理演算子がブール値ではなくオブジェクトを返すのはなぜですか?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
obj.fn()
(定義されている場合)ORの結果を返すobj._
が、ブール結果を返さない理由を理解したい。
これらの論理演算子がブール値ではなくオブジェクトを返すのはなぜですか?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
obj.fn()
(定義されている場合)ORの結果を返すobj._
が、ブール結果を返さない理由を理解したい。
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
""
null
undefined
NaN
document.all
ここではもちろん、議論のために論理値を引用しています。もちろん、リテラル文字列"false"
は value と同じではないfalse
ため、真です。
簡単に言えば:
この||
演算子は、最初の真の値を返します。真の値がない場合は、最後の値 (偽の値) を返します。
この&&
演算子は最初の偽の値を返し、偽の値がない場合は最後の値 (真の値) を返します。
それは本当に簡単です。コンソールで実験して、自分の目で確かめてください。
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
console.log("" || "Dog"); // "Dog"
console.log("Cat" || "Dog"); // "Cat"
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false
ブール値を返します。
アップデート
これは私のテストに基づいていることに注意してください。私は完全に信頼されるべきではありません。
代入も価値もない表現です。むしろ、計算された値を割り当てます。true
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._
ここでJSのspec(11.11)を参照できます。
セマンティクス
プロダクションLogicalANDExpression:LogicalANDExpression&&BitwiseORExpressionは次のように評価されます。
2. GetValue(Result(1))を呼び出します。
3. ToBoolean(Result(2))を呼び出します。
4. Result(3)がfalseの場合、Result(2)を返します。
5.BitwiseORExpressionを評価します。
6. GetValue(Result(5))を呼び出します。
7.結果(6)を返します。
仕様についてはこちらをご覧ください
比較:
var prop;
if (obj.value) {prop=obj.value;}
else prop=0;
と:
var prop=obj.value||0;
真または偽だけでなく、真の式を返すと、通常、コードが短くなり、読みやすくなります。これは||では非常に一般的ですが、&&ではそれほど一般的ではありません。
まず、返されるには true でなければならないため、真実性をテストしている場合は違いはありません
次に、次の行に沿って割り当てを行うことができます。
function bar(foo) {
foo = foo || "default value";