ここで考慮する必要がある 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) == truetrue == trueもちろんどちらが真であるかを比較します。でも、
(obj || true) == true多くの型強制§11.9.3を行い、比較します
ToPrimitive(obj) == ToNumber(true)( §9.1および§9.3 ) 結果はNaN == 1false になります。
厳密な等価演算子§11.9.6を使用すると、結果がより予測しやすくなります。