今天在 JS笔试题 被 @公子 给AT了,遂想起以前要写的一篇文章,javascript 中蛋疼的比较运算。javascript
翻译自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3java
比较运算 x==y
, 其中 x
和 y
是值,产生 true
或者 false
。这样的比较按以下方式进行:算法
若 Type(x)
与 Type(y)
相同, 则segmentfault
若 Type(x)
为 Undefined
, 返回 true
。微信
若 Type(x)
为 Null
, 返回 true
。编码
若 Type(x)
为 Number
, 则spa
若 x
为 NaN
, 返回 false
。翻译
若 y
为 NaN
, 返回 false
。code
若 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
对象都与字符串值相等,可是两个字符串对象互不相等。例如:
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 上表现不一样。