隐式转换(==)

92 阅读1分钟

当使用双等号(==)进行比较时,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。