基本规则
- 如果两值类型相同,直接比较值是否相等(例如两个数字比较其值)。
- 如果两值类型不同,会尝试将两值转换为相同的类型,然后再比较。
类型转换规则
2.1 null 和 undefined
null == undefined → true
null 或 undefined 和其他任何值比较时 → false
console.log(null == undefined); // true
console.log(null == 0); // false
console.log(undefined == 0); // false
2.2 布尔值
布尔值会被转换为数字:
true → 1,false → 0
console.log(true == 1); // true
console.log(false == 0); // true
console.log(true == “1”); // true
2.3 字符串和数字
字符串会尝试被转换为数字(如果可能),再进行比较。
console.log(“123” == 123); // true
console.log(“0” == false); // true
console.log(“abc” == NaN); // false
2.4 对象和原始值
对象会被转换为其原始值(通过调用 valueOf 或 toString 方法)。
console.log([1] == 1); // true
console.log([] == 0); // true
console.log([1, 2] == “1,2”); // true
console.log({} == “[object Object]”); // false
2.5 特殊情况:NaN
NaN 和任何值都不相等,包括它自身。
console.log(NaN == NaN); // false
console.log(NaN != NaN); // true
表达式 | 结果 | 解释 |
---|---|---|
null == undefined |
true |
null 和 undefined 被视为相等 |
"123" == 123 |
true |
字符串 "123" 转换为数字 123 |
true == 1 |
true |
布尔值 true 转换为数字 1 |
false == 0 |
true |
布尔值 false 转换为数字 0 |
[] == 0 |
true |
空数组 [] 转换为数字 0 |
[1] == 1 |
true |
单元素数组 [1] 转换为其原始值 1 |
[1, 2] == "1,2" |
true |
数组 [1, 2] 转换为字符串 "1,2" |
{} == "[object Object]" |
false |
普通对象和字符串直接比较,不触发类型转换 |
NaN == NaN |
false |
NaN 永远不等于任何值,包括自身 |