テストコードは次のとおりです。bool(true)&& stringの結果がjavascriptの文字列であるのはなぜですか?
結果はabc
である理由を私に伝えることができ
console.log(true && "abc");//abc
?
テストコードは次のとおりです。bool(true)&& stringの結果がjavascriptの文字列であるのはなぜですか?
結果はabc
である理由を私に伝えることができ
console.log(true && "abc");//abc
?
MDN (Logical Operators) - Logical And (&&)から:それはfalseに変換できる場合
戻り値は、式expr1;それ以外の場合は、 expr2を返します。したがって、ブール値で使用された場合、& &は、両方とも オペランドがtrueの場合はtrueを返します。それ以外の場合はfalseを返します。
true
明らかにfalseと評価できないため、2番目の値が返されます。これは "abc"です。
JavaScriptで&&
演算子は「これは常に(全体の式が真であるかどうかを—「truthy」—または偽—「falsy」)とdoesnの最後に評価部分式の値を返すCやJavaやなどに比べてやや異なっています結果を強制的にブール値にします。それが失敗すると(値の1つが「偽」である場合)、同様に結果は生の値であり、値の真偽の解釈ではありません。
だから、それはこのようなものだ:
A && B
を与えられ、インタプリタは、以下を行いキャストA Vからbooleanfalse
の場合、&&
発現は V&&
式の値としてBを Vif
文のこのようif
ステートメント自体が発現の全体的な結果にtruthy/falsyテストを実行するため、&&
発現は、CまたはJavaでブールキャスティングオペレータと同じ効果を有します。しかし、それ自体で使用される場合は、「最初の表現が真実なら2番目の表現の価値を、それ以外の場合は最初の表現の価値を私に与えてください」のようになります。
&&
は、左側がfalse
と評価された場合は左側を返し、それ以外の場合は右側のサイズを返します。
true
はfalse
ではないため、右側に文字列を返します。
> 0 && true // LHS is false, return LHS
0
> 1 && true // LHS is true, return RHS
true
> false && 0 // LHS is false, return LHS
false
> true && false // LHS is true, return RHS
false
あなたはやや!!()
に式をラップすることによってことを "解決" することができます
!!(true && 'abc');
二重否定を実行すると最初のオペランドを返すのではなく、最初の否定を行うときに 'abc'をブール値に変換するので(これは空ではないので、この文字列を 'true'に変換し、それを否定します)、正しい値を得るために再度否定します。私は、それがまだ 'abc'が返されているという裏の理由を説明する必要があると思います。ちょうどそれがブール値に変換されています。 –
@RobertKoritnik:確かに、 "修正"は "達成"に置き換えてください。 – jAndy
@RobertKoritnik:実際には、 '!!()'は '&& 'と組み合わせたすべての条件が' true'なら 'true'を返します。それ以外の場合は、常に 'false'に加えてOPのような値を扱う必要はありません。 – jAndy
参照:http://stackoverflow.com/q/2587182 – CMS
** Proのヒント**これらはおそらく同等です: 'someBoolVar? DoTrue():DoFalse() 'は' someBoolVar && DoTrue()||と同じです。 DoFalse() 'ではなく、2番目のものについて知っているので、他の擬似演算子もJavascriptで書くことが容易になります。 **合体**: 'someVar || defaultValue' –