2

結果を確認するには、Google Chrome でコンソールを開き、次の手順を実行します。

obj = new Boolean(false)
"obj && true: " + (obj && true)
"obj || true: " + (obj || false)

と:

(obj && true) == true   // this is true
(obj || false) == true   // this is false

なぜ

(obj || false)

ブール値ではなく、ブール オブジェクトを返しますか?

(うーん..以下に回答として要約も入れます)

4

6 に答える 6

3

ここで考慮する必要がある 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を使用すると、結果がより予測しやすくなります。

于 2013-05-14T08:31:35.560 に答える
2

最初のケースでは、objは真の値なので、true && true は true を返します。

2 番目のケースでは、 である obj を返しますBoolean{}。次に、それを String にキャストすると (そうすると、これが発生します"string" + (obj || false))、そのが返されます。これは「false」です。

繰り返しますが、これは のobjis ですfalseが、オブジェクト自体はtruthy値であるためです!

于 2013-05-14T08:15:54.607 に答える
1

最初の例では、 yourobjは truey と評価されるため、truthy && true == true.

2 番目の例では、 while を評価している間、 object is は再び真であると見なされるため、遅延評価は を評価した後に停止しobjます。次にobjが返され、それ自体が の値を生成しますfalse

于 2013-05-14T08:13:36.527 に答える
0

私の Chrome ブラウザーは、前のステートメントに対して true を返し、後者のステートメントに対してブール オブジェクトを返します。

于 2013-05-14T08:15:41.400 に答える
0

オブジェクト (obj) はラップされたブール値であり、JavaScript はそれをそのように扱います。

(new Boolan(false) || false) は確かに false です。

于 2013-05-14T08:13:34.643 に答える