当使用双等号(==)进行比较时,JavaScript会根据以下规则进行隐式类型转换:
1. 如果两个值的数据类型相同,则直接进行比较,返回相应的结果。
1 == 1; // true
'hello' == 'hello'; // true
2. 如果一个值为null,另一个值为undefined,则它们被认为相等。
null == undefined; // true
3. 如果一个值为数字,另一个值为字符串,则将字符串转换为数字后再进行比较。
1 == '1'; // true
0 == ''; // true
4. 如果一个值为布尔值,另一个值为非布尔值,则将布尔值转换为数字(true转换为1,false转换为0)后再进行比较。
true == 1; // true
false == 0; // true
// 补充:字符串会被转换为NaN,空字符串则转换成0
false == '' // true
true == 'a' // false
false== 'a' // false
5. 如果一个值为对象,另一个值为非对象,则将对象转换为原始值(ToPrimitive)后再进行比较。对象转换为原始值的过程是先调用valueOf()方法,如果返回的不是原始值,则再调用toString()方法。
var obj = { valueOf: function() { return 42; } };
obj == 42; // true
需要注意的是,隐式类型转换可能会导致一些意想不到的结果,因此建议在比较值时尽量使用严格相等运算符(===),它不会进行隐式类型转换,要求值和数据类型都完全相等才会返回true。