🧠 JavaScript 类型强制转换 — 一个能教会你的问题
发布: (2026年2月7日 GMT+8 14:33)
3 分钟阅读
原文: Dev.to
Source: Dev.to
让我们来聊聊一个看起来不对但 100 % 合法 的 JavaScript 表达式 👀
[] == ![]
乍一看,大多数人会认为它的结果是 false。 👉 但实际结果是 true。
第 1 步:求逻辑非
![]
[]是对象。- 在 JavaScript 中,所有对象都是 truthy(真值)。
- 对真值使用
!会得到false。
于是表达式变成:
[] == false
第 2 步:宽松相等(==)触发类型强制转换
当 == 的其中一个操作数是布尔值时,JavaScript 会先把布尔值转换为数字:
false → 0(true → 1)。
所以比较变为:
[] == 0
第 3 步:对象‑转‑原始值的转换
当对象与原始值进行 == 比较时,会使用 默认 提示,遵循 “Number” 转换顺序:
- 首先调用
valueOf()(对数组来说返回的仍是对象本身)。 - 若未得到原始值,则调用
toString()。
[].toString() // ""
此时比较变为:
"" == 0
第 4 步:最终强制转换
在字符串‑与‑数字的比较中,字符串会被转换为数字:
Number("") → 0
于是比较变成:
0 == 0 // true
✅ 结果: true
🔑 关键要点
- JavaScript 遵循严格且确定的强制转换规则。
==允许隐式转换,这可能会让人感到惊讶。- 数组会转换为字符串(
[] → "")。 - 布尔值会转换为数字(
false → 0,true → 1)。 - 了解这些规则后,这种行为就可以预料到了。
- 对于大多数生产代码,推荐使用
===(严格相等)。
使用 + 运算符的类型强制转换
情形 1:[] + 1
结果: "1"
+可以表示数值相加 或 字符串拼接。- 当其中一个操作数被转换为字符串时,拼接优先。
[] → ""(空字符串)。
"" + 1 // "1"
使用 - 运算符的类型强制转换
情形 2:[] - 1
结果: -1
-只能用于数值运算,双方都会被强制转为数字。[] → "" → 0。
0 - 1 // -1
🚀 挑战(对象比较)
既然我们已经了解了数组的行为,试着对普通对象进行以下比较:
{} == !{}
{} - 1
{} + 1
你认为它们的输出会是什么——以及原因是什么?