JS 数据类型转换专题(二)
一、基本规则
1. 强制类型转换的三种基本形式
- ToPrimitive:对象 → 原始值(优先调用
valueOf()或toString()) - ToNumber:值 → 数字(如
true→1,null→0,undefined→NaN) - ToString:值 → 字符串(如
[1,2]→"1,2")
2. 常见值的类型转换结果
| 值 | ToNumber 结果 | ToString 结果 | ToBoolean 结果 |
|---|---|---|---|
undefined | NaN | "undefined" | false |
null | 0 | "null" | false |
true | 1 | "true" | true |
false | 0 | "false" | false |
0 | 0 | "0" | false |
NaN | NaN | "NaN" | false |
""(空字符串) | 0 | "" | false |
[](空数组) | 0 | "" | true |
[1](单元素数组) | 1 | "1" | true |
[1,2](多元素数组) | NaN | "1,2" | true |
{}(空对象) | NaN | "[object Object]" | true |
二、运算与比较的核心规则
1. 加法运算(+)
只要有一个操作数是字符串,则另一个操作数会被转为字符串,然后拼接。
"1" + 2 // "12"(2 → "2")
true + "hi" // "truehi"(true → "true")
否则,两个操作数都会被转为数字,再进行加法。
1 + true // 2(true → 1)
[] + [] // ""([] → "","" + "" = "")
2. 非加法运算(如 -、*、/、>、<)
所有操作数都会先转为数字,再进行运算。
[1] - 0 // 1([1] → 1)
null > 0 // false(null → 0,0 > 0 → false)
3. 相等比较(==)
两边类型不同时,会先进行类型转换,再比较值是否相等。
null和undefined互相相等,但不与其他值相等。- 布尔值先转为数字(
true→1,false→0)。 - 字符串与数字比较时,字符串转为数字。
- 对象与原始值比较时,对象先转为原始值(
ToPrimitive)。
'true' == true // false('true' → NaN,true → 1,NaN ≠ 1)
[] == 0 // true([] → 0,0 == 0)
[1] == 1 // true([1] → 1,1 == 1)
如果两边类型相同,则直接比较值是否相等(注意区分基本类型和引用类型)
4. 严格相等(===)
不进行类型转换,直接比较类型和值是否相等。
'1' === 1 // false(类型不同)
三、经典场景解析
1. 'true' == true
解析:
true转为数字1。'true'转为数字NaN。NaN不等于任何值(包括NaN),结果为false。
2. true + false
解析:
true转为数字1,false转为数字0。1 + 0 = 1,结果为1。
3. [1] > null
解析:
[1]转为数字1([1].valueOf()→[1]→1)。null转为数字0。1 > 0,结果为true。
4. {} + [] + {} + [1]
解析:
- 第一个
{}:被解析为代码块(非表达式),忽略。 []:转为空字符串""。- 第二个
{}:转为字符串"[object Object]"。 [1]:转为字符串"1"。- 拼接结果:
"" + "[object Object]" + "1" = "[object Object]1"。
四、解析步骤总结
- 判断运算类型:加法(
+)优先考虑字符串拼接,其他运算优先转为数字。 - 检查操作数类型:对象先转为原始值(
ToPrimitive),再根据规则转换。 - 遵循转换规则:重点记忆
null、undefined、数组、对象的转换结果。 - 注意特殊情况:如
{}在加法中的解析(可能被视为代码块)。