JavaScript 的隐式类型转换(Implicit Type Coercion)会在某些操作或上下文中自动触发,将值从一种类型转换为另一种类型。以下是常见的触发场景:
1. 使用 `==`(宽松相等)比较时
`==` 会尝试将两边的值转换为相同类型后再比较(`===` 不会转换)。
console.log(1 == '1'); // true(字符串 '1' 转为数字 1)console.log([] == 0); // true([] → '' → 0)
2. 算术运算符(`+`、`-`、`*`、`/`、`%`)
- `+`:如果一方是字符串,则优先转为字符串拼接;否则尝试转为数字。
console.log(1 + '2'); // "12"(数字 1 转为字符串)console.log(true + 3); // 4(true → 1)
- 其他算术运算符(`-`、`*` 等):强制转为数字。
console.log('5' - '2'); // 3(字符串转数字)console.log('a' * 2); // NaN('a' 无法转为数字)
3. 逻辑运算符(`&&`、`||`、`!`)
- `!`(非运算符):将值转为布尔类型。
console.log(!0); // true(0 是 falsy)console.log(!'hi'); // false(非空字符串是 truthy)
- `if`、`while` 等条件语句:隐式转为布尔值。
if ('hello') console.log('true'); // 输出(非空字符串为 true)
4. 对象与原始值交互时
对象会通过 `valueOf()` 和 `toString()` 转为原始值:
console.log({} + []); // "[object Object]"({} 和 [] 均转为字符串)console.log({} - []); // NaN(转为字符串后无法作为数字运算)
5. 关系比较(`>`、`<`、`>=`、`<=`)
- 如果一方是数字,另一方转为数字:
console.log('10' > 5); // true('10' → 10)
- 如果双方都是字符串,则按字典序比较:
console.log('2' > '10'); // true(比较字符编码)
6. `parseInt`/`parseFloat` 的隐式转换
虽然它们显式转换字符串为数字,但会忽略非数字后缀:
console.log(parseInt('12px')); // 12(隐式忽略 'px')console.log('12px' - 0); // NaN(隐式转换失败)
7. 数组的隐式转换
- 数组在算术运算或字符串拼接时会转为原始值:
console.log([] + 1); // "1"([] → '')console.log([1, 2] + '3'); // "1,23"(数组转字符串)
8. 特殊规则:`null` 和 `undefined`
- 在 `==` 下,`null` 和 `undefined` 互等,且不等于其他值:
console.log(null == undefined); // trueconsole.log(null == 0); // false
关键点
1. 避免隐式转换:使用 `===` 和显式转换(如 `Number()`、`String()`)。
2. 注意 `falsy` 值:`0`、`''`、`null`、`undefined`、`NaN`、`false` 在布尔上下文中为 `false`。
3. 对象的转换顺序:先调用 `valueOf()`,若返回非原始值则调用 `toString()`。