javascriptの中の比較を詳しく説明してください.

5437 ワード

コード1: 
[] == []  // false   [] === [] // false   {} == {}  // SyntaxError: Uexpected token ==   {} === {} // SyntaxError: Uexpected token ===   コード2:
var n 0 = 123;   var n 1 = new Number(123)   var n 2 = new Number(123)   var n 3 = Number(123)   var n 4 = Number(123)      n 0 == n 1;  // true   n 0 == n 3;  // true   n 0 === n 1; // false   n 0 === n 3; // true      n 1 == n 2;  // false   n 1 === n 2; // false   n 1 == n 3;  // true   n 1 === n 3; // false      n 3 == n 4;  // true   n 3 === n 4; // true    なぜこの結果ですか? 
私たちは注意深く仕様を読む必要があります. http://ecmascript.cn/#203
11.9.3抽象同等比較アルゴリズム
比較演算  x==y  x 和  y は値です  true または  false.このような比較は以下のように行われる.
若し  Type(x) を選択します  Type(y) 同じ「なら」
若し  Type(x) を選択します  Undefined、戻ります  true若し  Type(x) を選択します  Null、戻ります  true若し  Type(x) を選択します  Numberであれば、
若し  x を選択します  NaN、戻ります  false若し  y を選択します  NaN、戻ります  false若し  x を選択します  y は等しい値です.  true若し  x を選択します  +0 且  y を選択します  −0、戻ります  true若し  x を選択します  −0 且  y を選択します  +0、戻ります  true戻る  false若し  Type(x) を選択します  Stringの場合、  x 和  y 完全に同じ文字列(長さが等しく、同じ文字が同じ位置にある場合)に戻ります.  trueさもないと  false若し  Type(x) を選択します  Boolean  x 和  y 同じものとする  true 同じです  false を返します  trueそうでなければ、falseを返します.質に入れる  x 和  y 同じオブジェクトを参照するときに戻ります.  true.さもないと  false若し  x を選択します  null 且  y を選択します  undefined、戻ります  true若し  x を選択します  undefined 且  y を選択します  null、戻ります  true若し  Type(x) を選択します  Number 且  Type(y) を選択します  String、戻ります  comparison x == ToNumber(y) の結果です若し  Type(x) を選択します  String 且  Type(y) を選択します  Number,比較を返します  ToNumber(x) == y の結果です若し  Type(x) を選択します  Boolean、比較に戻る.  ToNumber(x) == y の結果です若し  Type(y) を選択します  Boolean、比較に戻る.  x == ToNumber(y) の結果です若し  Type(x) を選択します  String または  Number  Type(y) を選択します  Object、比較に戻る.  x == ToPrimitive(y) の結果です若し  Type(x) を選択します  Object 且  Type(y) を選択します  String または  Number、比較に戻る.  ToPrimitive(x) == y の結果です戻る  false注:以上の等しい定義で:
文字列比較はこのように強制的に実行できます.  "" + a == "" + b数値比較はこのように強制的に実行できます.  +a == +bブール値比較はこのように強制的に実行できます.  !a == !b注:等値比較操作は以下の不変を保証する.A != B に等しい  !(A==B)A == B に等しい  B == Aは、AとBの実行順序を除いて.注:等しい演算子は常に渡されません. 例えば、二つは違っています.  String オブジェクトは、同じ文字列の値を表します.== 演算子は、各  String オブジェクトは文字列の値と同じですが、2つの文字列オブジェクトは互いに等しくありません.たとえば:new String("a") == "a" 和  "a" == new String("a") 皆為る  truenew String("a") == new String("a") を選択します  false文字列比較で使用する方法は、単純に文字コードユニットのシーケンスが同じかどうかを検出することである.より複雑な、意味に基づく文字や文字列等の定義、およびUnicollating仕様で定義されたcollating orderはしない.だからUnicode標準では同じと考えられています.  String 値は異なると検出されるかもしれない.実際にこのアルゴリズムは、2つの文字列が既に正規化された形であると考えられている.
11.9.6厳格は比較アルゴリズムに等しい.
比較  x===y,x 和  y 値のためには生産が必要である.  true または  false.比較過程は以下の通りです.
もし  Type(x) を選択します  Type(y) の結果が一致しないので、戻ります.  false、そうでなければもし  Type(x) 結果は  Undefined、戻ります  true もし  Type(x) 結果は  Null、戻ります  true もし  Type(x) 結果は  Numberであれば、
もし  x を選択します  NaN、戻ります  false もし  y を選択します  NaN、戻ります  false もし  x を選択します  y 同じ数字で返します.  true もし  x を選択します  +0,y を選択します  -0、戻ります  true もし  x を選択します  -0,y を選択します  +0、戻ります  true 戻る  false もし  Type(x) 結果は  String,もし  x を選択します  y 完全に同じ文字列(同じ長さと同じ文字の位置)に戻ります.  true、そうでなければ、戻ります.  false もし  Type(x) 結果は  Boolean,もし  x を選択します  y すべて  true または  falseなら、戻ります.  true、そうでなければ、false に戻る.
もし  x 和  y 同一に引用  Object オブジェクト  true、そうでなければ、戻ります.  false 注:このアルゴリズムはSameValueアルゴリズムとは、符号付きゼロとNaNに対して異なる性能を示しています.