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
、数组、对象的转换结果。 - 注意特殊情况:如
{}
在加法中的解析(可能被视为代码块)。