比较 x == y, x 和 y 是值变量,返回 true 或者 false.这样的比较判断遵循以下规律:
如果 x 和 y 的类型一致(仅包括Number,String,Null,Undefined,Boolean,Object。Symbol属于ES6)
- 如果 x 的类型是 Underfined,返回 true.
- 如果 x 的类型是 Null,返回 true.
-
如果 x 的类型是 Number,那么:
- 如果 x 是 NaN,那么返回 false.
- 如果 y 是 NaN,那么返回 false.
- 如果 x 和 y 的值相等,那么返回 true.
- 如果 x 是 +0 且 y 的值是 -0,返回 true.
- 如果 x 是 -0 且 y 的值是 +0,返回 true.
- 其他情况返回 false.
- 如果 x 的类型是 String,那么除非 x 和 y 的字符顺序完全相同,且长度相等。否则返回 flase.
- 如果 x 的类型是 Boolean,如果 x 和 y 都是 true 或 false.否则返回 flase.
- 如果 x 和 y 引用自相同 Object,返回 true.
如果 x 为 null 且 y 为 underfined,返回 true.
如果 x 为 underfined 且 y 为 null,返回 true.
如果 x 的类型为 Number 且 y 的类型为 String,返回的结果为 x == ToNumber(y).
如果 x 的类型为 String 且 y 的类型为 Number,返回的结果为 ToNumber(x) == y.
如果 x 的类型为 Boolean,返回的结果为 ToNumber(x) == y.
如果 y 的类型为 Boolean,返回的结果为 x == ToNumber(y).
如果 x 的类型为 String 或者 Number 且 y 的类型是 Object,返回的结果是 x == ToPrimitive(y).
如果 x 的类型为 Object 且 y 的类型是 String 或者 Number,返回的结果是 ToPrimitive(x) == y.
除以上情况,全部返回 false.
TIPS
-
以下类型转换规则
- 字符串类型比较可以是: "" + a == "" + b
- 数字类型比较可以是: +a == +b
- 布尔类型比较可以是: !a == !b
-
以下操作等式结果不变
- != B 的结果与 !(A==B) 相同
- == B 的结果与 B == A 相同,除了对A和B的判定顺序有区别以外其他等同
-
等式操作的传递性并不总是正确的.比如,存在两个含有相同字符的字符串对象;每一个字符串对象都可以被认为等同于该字符,但两个字符串对象并不相等:
- new String("a") == "a" 与 "a" == new String("a") 结果都为 true.
- new String("a") == new String("a") 的结果却是 false.
- 字符串的比较仅仅是简单的顺序比较每个字符的值。并没有尝试使用更加复杂的,以语义为导向的字符定义或是字符串同性测试或是整理 Unicode 码的定义顺序。因此,仅根据Unicode标准规范,字符串值即可推测为不相等(比如不会比较全角和半角的编码差异)。实际上这个算法推测两端的字符串都已经是普通样式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。