標籤:完全 執行 new 比較 檢測 布爾 ring null 執行順序
抽象相等比較演算法
比較運算 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 中的比較(==和===)