JavaScript 相等(==)与全等(===)操作符
FALSY值
在 JavaScript 中只有 7 个 falsy 值。
这意味着当 JavaScript 期望一个布尔值,并被给与下面值中的一个时,它总是会被当做 false。
false |
false 关键字 |
---|---|
0 | 数值 zero |
0n | 当 BigInt 作为布尔值使用时, 遵从其作为数值的规则. 0n 是 falsy 值. |
" ", ' ',`` | 这是一个空字符串 (字符串的长度为零). JavaScript 中的字符串可用双引号 "" , 单引号 '' , 或 模板字面量 `` 定义。 |
null | null - 缺少值 |
undefined | undefined - 原始值 |
NaN | NaN - 非数值 |
TRUTHY值
在 JavaScript 中,truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。
所有值都是真值,除非它们被定义为 假值(即除 false
、0
、""
、null
、undefined
和 NaN
以外皆为真值)。
/*
* 注意:
* 判断空数组或者空对象不能使用该方法判断。
* 此问题常用对象、数据数据是否含有值的空值判断。
*
*/
Boolean({}) // => TURE
Boolean([]) // => TRUE
相等与全等
相等与全等操作符最本质的区别是相等()操作符会先将两个操作数进行类型转换然后再进行比较。全等(=)操作符直接进行比较,而不做任何处理。
相等
相同数据类型比较规则:
基本数据类型比较数值是否相等。
引用数据类型比较内存地址是否相同。
不同数据类型比较规则:
只要跟Number或者Boolean类型比较,都会将等式两边都转换为Number。
如果操作数是字符串,另一个操作数是数值,则再比较相等性前先将字符串转换为数值。
如果操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型按照上面的规则进行比较。
比较规则
类型 | 类型 | 其他说明 |
---|---|---|
对象 | 对象 | 比较是不是同一个内存地址 |
对象 | 字符串 | 对象先转为字符串,在和字符串进行比较 |
对象 | 布尔类型 | 两边都要先转为数值false 是 0,true 是 1对象类型先隐式调用toString()方法,然后在Number() |
对象 | 数字 | 对象要转为数字,在进行比较(对象先隐式调用toString()方法转为字符串,然后在把字符串转为数字使用Number()方法) |
数字 | 布尔 | 布尔转成数字(false 是 0,true 是 1),在和数字进行比较 |
数字 | 字符串 | 字符串转成数字使用Number()方法,在和数字进行比较 |
布尔 | 数字/字符 串 | 都转成数字在进行比较 |
null | undefined | true |
null/undefined | 其他类型 | 结果都是false |
NaN | NaN | false |
特殊情况
/*
* Number([]) 结果为0.
* Number({}) 结果为NaN.
*
*/
0 == [] // => true
0 === [] // => false
0 == {} // => false
0 === {} // => false
/*
* 常见问题
* 此问题类似取消定时器、节流、防抖函数监听。
* 取消监听函数必须要求监听函数与取消监听函数内存地址完全一致。
*
*/
[] == [] // => false
[] === [] // => false
{} == {} // => false
{} === {} // => false
null == null // => true
null == undefined // => true
null === null // => true
null === undefined // => false
NaN == NaN // => false
NaN === NaN // => false