类型转换 (Type Coercion)#

当操作符与不同类型的操作数一起使用时,JavaScript 引擎会自动进行类型转换。这个过程称为隐式类型转换。

布尔转换#

当非布尔值出现在需要布尔值的上下文中时(如 if 语句),会发生布尔转换。转换规则如下:

数据类型转换为 true 的值转换为 false 的值
Booleantruefalse
String任何非空字符串"" (空字符串)
Number任何非零数值(含无穷值)0NaN
Object任何对象null
UndefinedN/A (不存在)undefined

使用两个逻辑非操作符(!!)可以将一个值转换为其对应的布尔值。

javascript
console.log(!!"blue");  // true
console.log(!!0);       // false
console.log(!!{});      // true
console.log(!!"");      // false
console.log(!!12345);   // true

相等性判断#

ECMAScript 提供两组相等性操作符:宽松相等(==!=)与严格相等(===!==)。

宽松相等 (==) 与不相等 (!=)#

宽松相等(==)在比较前,会先对操作数进行类型转换。

转换规则摘要:

  1. 若任一操作数为布尔值,则先将其转换为数值再比较(false 转为 0true 转为 1)。
  2. 若一个操作数是字符串,另一个是数值,则尝试将字符串转换为数值再比较。
  3. 若一个操作数是对象,另一个不是,则调用对象的 valueOf()toString() 方法取得其原始值,再进行比较。
  4. nullundefined 宽松相等。
  5. nullundefined 与其它类型进行比较时,不进行转换。
  6. 若任一操作数是 NaN,结果为 false

示例:

表达式结果说明
null == undefinedtrue规则定义的特例。
"5" == 5true字符串 "5" 被转换为数值 5。
false == 0true布尔值 false 被转换为数值 0。
true == 1true布尔值 true 被转换为数值 1。
null == 0falsenull 不进行数值转换。
undefined == 0falseundefined 不进行数值转换。
NaN == NaNfalseNaN 不等于任何值,包括其自身。

宽松不相等(!=)的行为与 == 相反。

严格相等 (===) 与不全等 (!==)#

严格相等(===)在比较时不进行类型转换。只有当两个操作数的值和类型都相同时,结果才为 true

示例:

javascript
let result1 = ("55" == 55);  // true, "55" 转换为数值 55
let result2 = ("55" === 55); // false, 因为 string 类型与 number 类型不同
javascript
let result3 = ("55" != 55);  // false, 转换后相等
let result4 = ("55" !== 55); // true, 因为类型不同

特殊情况:Object.is()#

ES6 引入的 Object.is()=== 行为基本一致,但处理两个特殊情况不同:

  1. NaN 的比较

    javascript
    console.log(NaN === NaN);        // false
    console.log(Object.is(NaN, NaN)); // true
  2. +0-0 的比较

    javascript
    console.log(+0 === -0);        // true
    console.log(Object.is(+0, -0)); // false

最佳实践#

  • 始终使用严格相等(===)和严格不全等(!==)进行比较,以避免隐式类型转换带来的不确定性。