Skip to main content

JS 数据类型转换专题(二)

一、基本规则

1. 强制类型转换的三种基本形式

  • ToPrimitive:对象 → 原始值(优先调用 valueOf()toString()
  • ToNumber:值 → 数字(如 true1null0undefinedNaN
  • ToString:值 → 字符串(如 [1,2]"1,2"

2. 常见值的类型转换结果

ToNumber 结果ToString 结果ToBoolean 结果
undefinedNaN"undefined"false
null0"null"false
true1"true"true
false0"false"false
00"0"false
NaNNaN"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. 相等比较(==

两边类型不同时,会先进行类型转换,再比较值是否相等。

  • nullundefined 互相相等,但不与其他值相等。
  • 布尔值先转为数字(true1false0)。
  • 字符串与数字比较时,字符串转为数字。
  • 对象与原始值比较时,对象先转为原始值(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

解析

  1. true 转为数字 1
  2. 'true' 转为数字 NaN
  3. NaN 不等于任何值(包括 NaN),结果为 false

2. true + false

解析

  1. true 转为数字 1false 转为数字 0
  2. 1 + 0 = 1,结果为 1

3. [1] > null

解析

  1. [1] 转为数字 1[1].valueOf()[1]1)。
  2. null 转为数字 0
  3. 1 > 0,结果为 true

4. {} + [] + {} + [1]

解析

  1. 第一个 {}:被解析为代码块(非表达式),忽略。
  2. []:转为空字符串 ""
  3. 第二个 {}:转为字符串 "[object Object]"
  4. [1]:转为字符串 "1"
  5. 拼接结果:"" + "[object Object]" + "1" = "[object Object]1"

四、解析步骤总结

  1. 判断运算类型:加法(+)优先考虑字符串拼接,其他运算优先转为数字。
  2. 检查操作数类型:对象先转为原始值(ToPrimitive),再根据规则转换。
  3. 遵循转换规则:重点记忆 nullundefined、数组、对象的转换结果。
  4. 注意特殊情况:如 {} 在加法中的解析(可能被视为代码块)。