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抽象同等比較アルゴリズム
比較演算
若し
若し
若し
文字列比較はこのように強制的に実行できます.
11.9.6厳格は比較アルゴリズムに等しい.
比較
もし
もし
もし
[] == [] // 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")
皆為る true
new 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に対して異なる性能を示しています.