类型转换 (Type Coercion)#
当操作符与不同类型的操作数一起使用时,JavaScript 引擎会自动进行类型转换。这个过程称为隐式类型转换。
布尔转换#
当非布尔值出现在需要布尔值的上下文中时(如 if 语句),会发生布尔转换。转换规则如下:
| 数据类型 | 转换为 true 的值 | 转换为 false 的值 |
|---|---|---|
Boolean | true | false |
String | 任何非空字符串 | "" (空字符串) |
Number | 任何非零数值(含无穷值) | 0、NaN |
Object | 任何对象 | null |
Undefined | N/A (不存在) | undefined |
使用两个逻辑非操作符(!!)可以将一个值转换为其对应的布尔值。
console.log(!!"blue"); // true
console.log(!!0); // false
console.log(!!{}); // true
console.log(!!""); // false
console.log(!!12345); // true相等性判断#
ECMAScript 提供两组相等性操作符:宽松相等(== 和 !=)与严格相等(=== 和 !==)。
宽松相等 (==) 与不相等 (!=)#
宽松相等(==)在比较前,会先对操作数进行类型转换。
转换规则摘要:
- 若任一操作数为布尔值,则先将其转换为数值再比较(
false转为0,true转为1)。 - 若一个操作数是字符串,另一个是数值,则尝试将字符串转换为数值再比较。
- 若一个操作数是对象,另一个不是,则调用对象的
valueOf()或toString()方法取得其原始值,再进行比较。 null和undefined宽松相等。null和undefined与其它类型进行比较时,不进行转换。- 若任一操作数是
NaN,结果为false。
示例:
| 表达式 | 结果 | 说明 |
|---|---|---|
null == undefined | true | 规则定义的特例。 |
"5" == 5 | true | 字符串 "5" 被转换为数值 5。 |
false == 0 | true | 布尔值 false 被转换为数值 0。 |
true == 1 | true | 布尔值 true 被转换为数值 1。 |
null == 0 | false | null 不进行数值转换。 |
undefined == 0 | false | undefined 不进行数值转换。 |
NaN == NaN | false | NaN 不等于任何值,包括其自身。 |
宽松不相等(!=)的行为与 == 相反。
严格相等 (===) 与不全等 (!==)#
严格相等(===)在比较时不进行类型转换。只有当两个操作数的值和类型都相同时,结果才为 true。
示例:
let result1 = ("55" == 55); // true, "55" 转换为数值 55
let result2 = ("55" === 55); // false, 因为 string 类型与 number 类型不同let result3 = ("55" != 55); // false, 转换后相等
let result4 = ("55" !== 55); // true, 因为类型不同特殊情况:Object.is()#
ES6 引入的 Object.is() 与 === 行为基本一致,但处理两个特殊情况不同:
-
NaN的比较console.log(NaN === NaN); // false console.log(Object.is(NaN, NaN)); // true -
+0和-0的比较console.log(+0 === -0); // true console.log(Object.is(+0, -0)); // false
最佳实践#
- 始终使用严格相等(
===)和严格不全等(!==)进行比较,以避免隐式类型转换带来的不确定性。