2012-07-18 3 views
18

テストコードは次のとおりです。bool(true)&& stringの結果がjavascriptの文字列であるのはなぜですか?

結果は abcである理由を私に伝えることができ
console.log(true && "abc");//abc 

+0

参照:http://stackoverflow.com/q/2587182 – CMS

+1

** Proのヒント**これらはおそらく同等です: 'someBoolVar? DoTrue():DoFalse() 'は' someBoolVar && DoTrue()||と同じです。 DoFalse() 'ではなく、2番目のものについて知っているので、他の擬似演算子もJavascriptで書くことが容易になります。 **合体**: 'someVar || defaultValue' –

答えて

16

MDN (Logical Operators) - Logical And (&&)から:それはfalseに変換できる場合

戻り値は、式expr1;それ以外の場合は、 expr2を返します。したがって、ブール値で使用された場合、& &は、両方とも オペランドがtrueの場合はtrueを返します。それ以外の場合はfalseを返します。

true明らかにfalseと評価できないため、2番目の値が返されます。これは "abc"です。

6

JavaScriptで&&演算子は「これは常に(全体の式が真であるかどうかを—「truthy」—または偽—「falsy」)とdoesnの最後に評価部分式の値を返すCやJavaやなどに比べてやや異なっています結果を強制的にブール値にします。それが失敗すると(値の1つが「偽」である場合)、同様に結果は生の値であり、値の真偽の解釈ではありません。

だから、それはこのようなものだ:

  1. は、式Aを評価し、 Bはの結果とする
  2. V —値を与える:A && Bを与えられ、インタプリタは、以下を行いキャストA Vからboolean
  3. A Bfalseの場合、&&発現は V
  4. &&式の値としてBを V
  5. 戻りB Vを与える、式Bを評価しています。 if文のこのよう

ifステートメント自体が発現の全体的な結果にtruthy/falsyテストを実行するため、&&発現は、CまたはJavaでブールキャスティングオペレータと同じ効果を有します。しかし、それ自体で使用される場合は、「最初の表現が真実なら2番目の表現の価値を、それ以外の場合は最初の表現の価値を私に与えてください」のようになります。

+1

必ずしも最後の値を返すとは限りません。 '(0 && true)'は '0'(最初の値)を返します。 – Quentin

+0

@クエンティンだからこそ、私は「真実であれ、真実であれ」と陳述しました。 「それ」は表現全体を意味していました。私はそれを再度語ります。 – Pointy

+0

@Quentin:論理演算子のオペランドを評価している間に最後の値を返します。評価を中断しなかった最後のものは、評価を終了するときに常に保存され、返されます。だから* somhow *最後の真実*値を返す。 –

1

&&は、左側がfalseと評価された場合は左側を返し、それ以外の場合は右側のサイズを返します。

truefalseではないため、右側に文字列を返します。

> 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 
0

あなたはやや!!()に式をラップすることによってことを "解決" することができます

!!(true && 'abc'); 
+0

二重否定を実行すると最初のオペランドを返すのではなく、最初の否定を行うときに 'abc'をブール値に変換するので(これは空ではないので、この文字列を 'true'に変換し、それを否定します)、正しい値を得るために再度否定します。私は、それがまだ 'abc'が返されているという裏の理由を説明する必要があると思います。ちょうどそれがブール値に変換されています。 –

+1

@RobertKoritnik:確かに、 "修正"は "達成"に置き換えてください。 – jAndy

+0

@RobertKoritnik:実際には、 '!!()'は '&& 'と組み合わせたすべての条件が' true'なら 'true'を返します。それ以外の場合は、常に 'false'に加えてOPのような値を扱う必要はありません。 – jAndy

関連する問題