空对象加空数组等于零:JavaScript 没坏,是解析器在耍花招
来源:dev.to — 2026-10-29
📋 概述
{} + [] 得到 0,这既不是 bug 也不是玩笑。关键在于语句开头的那对花括号根本没有被当成对象字面量:解析器把它读成一段空代码块,什么也不做,剩下的一元加号 +[] 才真正开始运算。于是一路走类型转换:空数组先被转成空字符串,空字符串再被转成数字 0。作者借此说明 JS 的「怪」为什么会长期存在——这门十天写出来的语言必须兼容上百万个还活着的老网站,任何语法调整都得向后兼容,所以怪癖会陪我们到最后。
🔑 核心要点
- 花括号的含义由解析器决定:出现在语句开头时它是代码块,出现在表达式里才是对象字面量,同一个符号两种身份。
- 一元加号触发 ToNumber:空数组先 toString 成空串,再被数字转换规则吃掉,得到 0——整条链路没有一步是随机行为。
- 动态类型加弱类型才会出现这种表达式:类型不在变量上,转换规则又宽松,两者叠加才有隐式转换的表演空间。
- 兼容性是怪癖的护身符:只要还有站点依赖旧行为,语言规范就不能改,所以这类题目会一直是面试与吐槽的素材。
💡 金句
JavaScript's weirdness is probably here to stay forever!
译:JavaScript 的古怪,大概会永远留在这里。
👍 0
👎 0
← 返回 dev.to 首页