13

これは true を返します。

[] == false

しかし、ここでは、アラートが呼び出されます:

if([]){ alert('empty array is true here'); }

理由を説明できますか?

4

2 に答える 2

14

ECMAScript® 言語仕様セクション 11.9.3によると、比較は次のように行われます。==

  1. Type(x) が Type(y) と同じ場合、
    1. Type(x) が未定義の場合、true を返します。
    2. Type(x) が Null の場合、true を返します。
    3. Type(x) が Number の場合、
      1. x が NaN の場合、false を返します。
      2. y が NaN の場合、false を返します。
      3. x が y と同じ数値の場合、true を返します。
      4. x が +0 で y が -0 の場合、true を返します。
      5. x が −0 で y が +0 の場合、true を返します。
      6. false を返します。
    4. Type(x) が String の場合、x と y がまったく同じ文字シーケンス (同じ長さと対応する位置の同じ文字) であれば true を返します。それ以外の場合は false を返します。
    5. Type(x) が Boolean の場合、x と y が両方とも true または両方とも false の場合に true を返します。それ以外の場合は false を返します。
    6. x と y が同じオブジェクトを参照している場合は true を返します。それ以外の場合は false を返します。
  2. x が null で y が定義されていない場合は、true を返します。
  3. x が未定義で y が null の場合、true を返します。
  4. Type(x) が Number で Type(y) が String の場合、比較 x == ToNumber(y) の結果を返します。
  5. Type(x) が String で Type(y) が Number の場合、比較 ToNumber(x) == y の結果を返します。
  6. Type(x) が Boolean の場合、比較 ToNumber(x) == y の結果を返します。
  7. Type(y) が Boolean の場合、比較 x == ToNumber(y) の結果を返します。
  8. Type(x) が String または Number のいずれかで、Type(y) が Object の場合、比較 x == ToPrimitive(y) の結果を返します。
  9. Type(x) が Object で Type(y) が String または Number の場合、比較 ToPrimitive(x) == y の結果を返します。
  10. false を返します。

最初のステップでToNumber()は、 に適用されfalse、 が生成されますNumber(0)。2 番目のステップでは、ルール #9 がToPrimitive()空の配列に適用さ""れ、数値にキャストすると同様になりNumber(0)ます。

さらに、セクション 9.2では、式でオブジェクトを使用することについて次のように述べています。

抽象演算ToBooleanは、次の表に従って、その引数をブール型の値に変換します。

  • 未定義 -> false
  • Null -> false
  • Boolean -> 結果は入力引数と同じです (変換なし)。
  • 数値 -> 引数が +0、-0、または NaN の場合、結果は false です。それ以外の場合、結果は true です。
  • 文字列 -> 引数が空の文字列 (長さがゼロ) の場合、結果は false です。それ以外の場合、結果は true です。
  • オブジェクト -> true
于 2013-03-06T06:42:30.837 に答える
9

これは==、JS では変換が強制され、ある型を別の型に変換できる場合、戻り値はtrueand ここでは変更できないため、またはboolと[]比較できないためです。 true を返す

if([])nullundefined

これを確認してください どの等号演算子 (== vs ===) を JavaScript 比較で使用する必要がありますか?

于 2013-03-06T06:34:56.747 に答える