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