ここで考慮する必要がある 2 つの概念があります。
obj = new Boolean(false)
値が であるオブジェクトを作成しますfalse
。オブジェクト自体は真実であると見なされます。その値 ( toString()
orで取得valueOf()
) はもちろんブール値false
です。
(x||y)
最初の真の値 (何も存在しない場合は、最後の偽の値) を返し、
(x&&y)
最初の偽の値を返します (何も存在しない場合は、最後の真の値)。
Boolean Objectを(obj||false)
返し、2 番目の ( ) 値を返します。(obj&&true)
true
さらに先行するものは、表現のコンテキストによって異なります。
"obj && true: " + (obj && true)
文字列コンテキストを要求するためtoString()
、ブールオブジェクトで呼び出され、その値を返しますfalse
(オブジェクト自体は真実です!)。
さらに、
(obj && true) == true
true == true
もちろんどちらが真であるかを比較します。でも、
(obj || true) == true
多くの型強制§11.9.3を行い、比較します
ToPrimitive(obj) == ToNumber(true)
( §9.1および§9.3 ) 結果はNaN == 1
false になります。
厳密な等価演算子§11.9.6を使用すると、結果がより予測しやすくなります。