相等和不相等,全等和不全等
相等和不相等 (==, !=)
先转换,再比较。通常称为强制转型
全等和不全等 (===, !==)
仅比较而不转换
转换规则-3 点(JS 高程)
- 如果有一个操作数是布尔值, 则在比较相等性之前先将其转换为数值,即 false 为 0, true 为 1。 布尔值 => 数值
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。 字符串 => 数值
-
| 如果一个操作数是对象,另一个操作数不是,则调用对象的方法,valueOf() 或者 toString() 方法,用得到的基本类型值按照前面的规则进行比较。 **对象 => 对象.valueOf() |
|
对象.toString() => 字符串 => 数值** |
还需要遵循下列规则(4 点)
- null 和 undefined 是相等的
- 要比较相等行之前,不能将 null 和 undefined 转换成其他任何值
- 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等 。 NaN == NaN // false
- 如果两个操作数都是对象,则比较它们是不是同一个对象,如果是,则为 true,否则为 false。
Function, Array, Object 属于引用类型,使用==操作符时,比较的是地址
- 引用类型是存放在堆内存中的,而在栈内存中会有一个或者多个地址来指向这个堆内存相对应的数据。
[] == ![] ? {} == !{} ?
[] == ![] => [] == false => Number([].toString()) = ‘’ => ‘’ == false => 0 == 0 => true
{} == !{} => {} == false => Number({}.toString()) => Number(‘[object Object]’) => NaN == false => false