1. 基本规则
-
如果两个值的类型相同,则直接比较它们的值。
javascript console.log(5 == 5); // true console.log('hello' == 'hello'); // true
-
如果两个值的类型不同,JavaScript 会尝试进行类型转换,使其类型相同,然后再进行比较。具体的转换规则如下:
2. 具体转换行为
-
布尔值与非布尔值:
- 在比较布尔值与其他值时,布尔值会被转换为数字:
true
转换为1
,false
转换为0
。
javascript console.log(true == 1); // true console.log(false == 0); // true console.log(true == 0); // false
- 在比较布尔值与其他值时,布尔值会被转换为数字:
-
数字与字符串:
- 当比较数字与字符串时,字符串会被转换为数字。
javascript console.log('5' == 5); // true,因为字符串 '5' 被转换为数字 5 console.log('10' == 10); // true console.log('5' == '5'); // true,两个字符串相等 console.log('abc' == 0); // false,'abc' 无法转换为有效数字
-
对象与基本类型:
- 当一个对象参与比较时,该对象会被转换为原始值。JavaScript 首先会调用对象的
valueOf()
方法,如果结果不是原始值,它会调用toString()
方法进行转换。
javascript const obj = { valueOf: () => 42, toString: () => '100' }; console.log(obj == 42); // true,因为调用了 valueOf() console.log(obj == '100'); // true,因为调用了 toString() console.log(obj == 100); // false
- 当一个对象参与比较时,该对象会被转换为原始值。JavaScript 首先会调用对象的
-
null 和 undefined:
null
只等于undefined
,而不等于其他任何值。
javascript console.log(null == undefined); // true console.log(null == 0); // false console.log(undefined == 0); // false
-
NaN(非数字) :
NaN
与任何值(包括它自己)比较时,是false
。
javascript console.log(NaN == NaN); // false console.log(NaN == 5); // false