詳解 javascript 中的比較(==和===)
阿新 • • 發佈:2017-08-12
不一致 mit 如果 asc onu tin 算法 復雜 undefine
抽象相等比較算法
比較運算 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
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
對象都與字符串值相等,但是兩個字符串對象互不相等。例如:
new String("a") == "a"
和"a" == new String("a")
皆為true
。new String("a") == new String("a")
為false
。
字符串比較使用的方式是簡單地檢測字符編碼單元序列是否相同。不會做更復雜的、基於語義的字符或者字符串相等的定義以及 Unicode 規範中定義的 collating order。所以 Unicode 標準中認為相等的 String
值可能被檢測為不等。實際上這一算法認為兩個字符串已經是經過規範化的形式。
嚴格等於比較算法
比較 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 上表現不同。
詳解 javascript 中的比較(==和===)