==的机制
约 472 字大约 2 分钟
2026-03-31
思考
js 中 == 是如何进行相等判断的?
在 JavaScript 中有 == 和 === 两种相等运算符。=== 严格相等运算符会先比较两者类型,若类型不同则直接返回 false。 而 == 宽松比较,数据类型相同比较数值,若两者数据类型不用,会先进行隐式转换,再进行值的比较。
转换规则:
NaN的特例:Nan与任何值(包括自身)比较都返回 false,也是唯一不等于自身的值。null与undefined:null与undefined两者互等(null==undefinedtrue),且与其它值(除了自身)都不相等。
数字类型趋势:布尔值、字符串、对象 在进行隐式转换时都有转换为数字类型的趋势。
- 布尔值:true 转换为 1,false 转换为 0。
- 字符串:非数字字符串转换为 Nan,数字字符串转换为对应的数字。空字符转换为 false。
- 对象:对象会调用
valueOf()或toString()转换为原始值(先调用valueOf()获取原始值,若不是原始值则调用toString()),再按上述规则比较。 null和undefined不进行任何转换。
下面是一些转换过程示例:
{a: 1} == 1
// 1. 类型不同,进行转换。{a:1} 先调用 valueOf 返回对象自身:{a: 1},1 为原始值
{a: 1} == 1
// 2. valueOf() 返回非原始值,继续调用 toString() 方法,obj.toString(); // 返回 "[object Object]"
"[object Object]" == 1
// 3. 字符串与数字比较,字符串转数字,Number("[object Object]") 返回 NaN
Nan == 1
// 4. NaN 与任何值都不相等,返回 false
false[1,2] = '1'
// 1. [1,2]通过 valueOf()返回数组自身:[1, 2] (非原始值)
[1,2] == '1'
// 2. 调用 toString(),数组的 toString() 相当于 join(',')返回 "1,2"
"1,2" == '1'
// 3. 两边都是字符串,直接比较字符串内容:
false