一. 相等操作符 ==
- 特点:如果数据类型不同,先进行强制类型转换(主要是用Number()转换为数值类型),再比较。
- 以下是一些特殊情况:
注意:
null == undefined
、null == null
、undefined == undefined
NaN 与任何数都不等(包括自己)
附上强制类型转换表:
例子 | 结果 | 原因 |
---|---|---|
null == null | true | JavaScript规范, null 不会被转换 |
null == undefined | true | JavaScript规定了 null == undefined |
undefined == undefined | true | JavaScript规定 |
null == 0 | false | null 不会被转换 |
undefined == 0 | false | undefined不会被转换 |
NaN == NaN | false | NaN与任何值都不等(包括自身) |
'NaN' == NaN | false | NaN与任何值都不等 |
[] == [] | false | 两边都是引用类型,比较引用的是否为同一个 |
[] == ![] | true | 先计算!得到false,根据规则布尔值转换为0,左边Number([])结果也为0。强制类型转换中空数组转换为数值为0,转换为布尔值为true
|
'' == [] | true | 空字符串和空数组转换为数值都为0 |
'' == '' | true | 空字符串转换为0 |
- 转换不同类型时,相等操作符遵循以下基本规则:
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值 —— false 转换为 0,而 true 转换为 1。
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
- 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较。
- 进行比较时则要遵循下列规则:
- null 和 undefined 是相等的。
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
- 如果有一个操作数是 NaN,则相等操作符返回 false。同时NaN不等于NaN。
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。
二. 全等操作符 ===
- 特点:仅仅是比较。如果两个数的数据类型都不同,直接返回false。
例子 | 结果 | 原因 |
---|---|---|
null === null | true | 完全相等 |
undefined === undefined | true | 完全相等 |
null === undefined | false | null和undefined类型不同 |
NaN === NaN | false | NaN 与任何值都不等 |
NaN === 'NaN' | false | NaN 与任何值都不等,而且两边类型都不同 |
{} === {} | false | 对象要比较是否为同一引用 |
[] === [] | false | 引用类型要比较是否为同一引用 |
true === true | true | 完全相等 |
false === false | true | 完全相等 |