4

私の知る限りで(x == false)は、 と同じことを行う必要があります。!xどちらもxブール値として解釈しようとし、それを否定するからです。

ただし、これをテストしようとすると、非常に奇妙な動作が発生し始めました。

例えば:

false == []どちらも trueをfalse == ![]返します。

さらに

false == undefinedtrue == undefinedどちらも false を返します。

false == Infinityそしてtrue == Infinityそして

false == NaNtrue == NaN

ここで何が起こっているのですか?

http://jsfiddle.net/AA6np/1/

4

3 に答える 3

6

すべてここにあります: http://es5.github.com/#x11.9.3

の場合false == []

  • falseこれは常にブール値で行われるため、数値 (0) に変換されます。
  • [] は を呼び出すことによってプリミティブに変換され[].valueOf().toString()ます。これは空の文字列です。
  • 0 == ""次に、空の文字列を数値に変換することによって評価され、その結果も 0 であるため、false == []真です。

の場合false == ![]

  • 論理否定演算子!は、の反対を返すことによって実行されますToBoolean(GetValue(expr))
  • ToBoolean()はどのオブジェクトに対しても常に true であるため、(because ) と![]評価されるため、これも true です。false!true = falsefalse == ![]

(false == undefined) === falseさらに(true == undefined) === false簡単です:

  • falsetrue再び数値に変換されます (それぞれ 0 と 1) 。
  • undefined は数値と比較できないため、チェーンはデフォルトの結果である にバブルスルーしますfalse

他の 2 つのケースも同じ方法で評価されます。最初にブール値を数値に変換し、次にこれを他の数値と比較します。0 も 1 も Infinity に等しくないか、非数ではないため、これらの式も に評価されfalseます。

于 2012-06-29T16:05:55.673 に答える
1

抽象等価アルゴリズムは、仕様のセクション 9.3 で説明されています。

x == yx =falseおよび y =の場合[]:

  1. いいえ。タイプは等しくありません。
  2. いいえ、x は null ではありません。
  3. いいえ。x は未定義ではありません。
  4. いいえ、x は数字ではありません
  5. いいえ、x は文字列ではありません。
  6. はい、x はブール値なので、ToNumber(x) と y を比較します。

アルゴリズム x=0と y= を繰り返し[]ます。
ステップ 8:Type(x) == number で終了します。および Type(y) == オブジェクト。
したがって、結果を x == ToPrimitive (y) とします。
ToPrimitive([]) == ""

0ここで、 x=と y=を使用してアルゴリズムをもう一度繰り返します""。4 で終わります: 「比較 x == ToNumber(y) の結果を返します。」
ToNumber("") == 0

アルゴリズムの最後の繰り返しはステップ 1 で終了します (型は等しい)。1.c.iii により、0 == 0 となり、true が返されます。

他の結果は、アルゴリズムを使用して同様の方法で取得できます。

于 2012-06-29T16:10:52.650 に答える
0
false == []

==Javascript を使用すると、変換を適用できます。オブジェクトはプリミティブに変換され、型がブール値と一致し、空の文字列が残ります。false は数値 0 に変換されます。 は空の文字列と数値 0 を比較します。文字列は数値に変換されて 0 になるため、式は「true」になります。

![]

Javascript はオブジェクトをブール値の true に変換するため、true を否定すると false になります。

false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN

また少し同じ!false は 0 に、true は 1 に変換されます。そして、undefined は数値に変換されます... NaN! いずれにせよ偽物

=== !==自分が何をしているのかよくわかっていない限り、「期待される」結果を得るためにできる限り使用することをお勧めします。eのようなものを使用するのBoolean(undefined) == falsもいいでしょう。

変換時の詳細については、ECMAScript の仕様を確認してください。

于 2012-06-29T16:22:08.233 に答える