🧠 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 → 0true → 1)。

所以比较变为:

[] == 0

第 3 步:对象‑转‑原始值的转换

当对象与原始值进行 == 比较时,会使用 默认 提示,遵循 “Number” 转换顺序:

  1. 首先调用 valueOf()(对数组来说返回的仍是对象本身)。
  2. 若未得到原始值,则调用 toString()
[].toString() // ""

此时比较变为:

"" == 0

第 4 步:最终强制转换

在字符串‑与‑数字的比较中,字符串会被转换为数字:

  • Number("") → 0

于是比较变成:

0 == 0   // true

结果: true

🔑 关键要点

  • JavaScript 遵循严格且确定的强制转换规则。
  • == 允许隐式转换,这可能会让人感到惊讶。
  • 数组会转换为字符串([] → "")。
  • 布尔值会转换为数字(false → 0true → 1)。
  • 了解这些规则后,这种行为就可以预料到了。
  • 对于大多数生产代码,推荐使用 ===(严格相等)。

使用 + 运算符的类型强制转换

情形 1:[] + 1

结果: "1"

  • + 可以表示数值相加 字符串拼接。
  • 当其中一个操作数被转换为字符串时,拼接优先。
  • [] → ""(空字符串)。
"" + 1   // "1"

使用 - 运算符的类型强制转换

情形 2:[] - 1

结果: -1

  • - 只能用于数值运算,双方都会被强制转为数字。
  • [] → "" → 0
0 - 1    // -1

🚀 挑战(对象比较)

既然我们已经了解了数组的行为,试着对普通对象进行以下比较:

{} == !{}
{} - 1
{} + 1

你认为它们的输出会是什么——以及原因是什么?

0 浏览
Back to Blog

相关文章

阅读更多 »

我的学习笔记

我已经编程 11 年了。主要是 Web,但我也涉及 backend、mobile、devops、AI 以及几乎你能想象的所有领域;我仍然常常觉得自己好像……

React-测验应用

React Quiz App 🧠 该项目展示了对 React 基础、基于组件的架构以及高效状态管理的实践理解。Live demo...

Var vs Let:大混淆解析!

封面图片:'Var vs Let: The Big Confusion Explained!' https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A...