JavaScript 相等(==)与全等(===)操作符

FALSY值

在 JavaScript 中只有 7 falsy 值。

这意味着当 JavaScript 期望一个布尔值,并被给与下面值中的一个时,它总是会被当做 false。

false false 关键字
0 数值 zero
0n BigInt 作为布尔值使用时, 遵从其作为数值的规则. 0nfalsy 值.
" ", ' ',`` 这是一个空字符串 (字符串的长度为零). JavaScript 中的字符串可用双引号 "", 单引号 '', 或 模板字面量 `` 定义。
null null - 缺少值
undefined undefined - 原始值
NaN NaN - 非数值

TRUTHY值

JavaScript 中,truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。

所有值都是真值,除非它们被定义为 假值(即除 false0""nullundefinedNaN 以外皆为真值)。

/*
* 注意:
* 判断空数组或者空对象不能使用该方法判断。
* 此问题常用对象、数据数据是否含有值的空值判断。
* 
*/
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
原文地址:https://www.cnblogs.com/Scooby/p/13523949.html