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()`。