これらの論理演算子がブール値ではなくオブジェクトを返すのはなぜですか?
_var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
_
なぜそれがobj.fn()
(定義されている場合)の結果を返すのかを理解したいOR _obj._
_がブール結果ではない。
var _ = ((obj.fn && obj.fn() ) || obj._ || ( obj._ == {/* something */}))? true: false
ブール値を返します。
[〜#〜]更新[〜#〜]
これは私のテストに基づいていることに注意してください。私は完全に信頼されるべきではありません。
notが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._
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ではfalse
、0
、-0
、""
、null
、undefined
、NaN
およびdocument.all
all falseとしてカウント 。
ここではもちろん、議論のために論理値を引用しています。もちろん、リテラル文字列"false"
は値false
と同じではないため、trueです。
最も簡単な言葉で:
||
演算子は最初の真の値を返し、真の値がない場合は最後の値(偽の値)を返します。
&&
演算子は最初の偽の値を返します。偽でないものがあれば、最後の値(真の値)を返します。
とても簡単です。コンソールで実験して、自分の目で確かめてください。
"" && "Dog" // ""
"Cat" && "Dog" // "Dog"
"" || "Dog" // "Dog"
"Cat" || "Dog" // "Cat"
ここで基本的な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'
以下のJSの仕様(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.Return Result(6)。
仕様については こちら を参照してください
ほとんどのプログラミング言語では、_&&
_および_||
_演算子はブール値を返します。 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
_
最初に、それが戻ることは真でなければならないので、あなたが真実性をテストしているなら、それは違いがありません
次に、次のように割り当てを行うことができます。
function bar(foo) {
foo = foo || "default value";
比較:
var prop;
if (obj.value) {prop=obj.value;}
else prop=0;
と:
var prop=obj.value||0;
真または偽だけでなく真実な式を返すと、通常はコードが短くなり、読みやすくなります。これは||では非常に一般的ですが、&&ではそれほど多くありません。
短絡演算子は、論理演算子よりもconditionals評価者と考える必要があります。
x || y
おおまかに対応します。
if (x) { return x } else { return y; }
およびx && y
おおまかに対応します。
if (x) { return y } else { return x; }
これを考えると、結果は完全に理解できます。