空数组转数字结果为0,因其ToPrimitive调用toString()得空字符串"",再经ToNumber转为0;而{}转为"[object Object]"导致NaN,开发中应避免依赖+arr判空,改用arr.length>0等显式检查。

空数组 [] 转为数字时,JavaScript 会先转成字符串,再转成数字,最终结果是 0。
为什么空数组转数字是 0?
这是因为 JavaScript 的强制类型转换遵循一套明确的抽象操作流程:
- 当使用一元加号
+、Number()或参与算术运算(如+ [])时,引擎会调用ToNumber(ToPrimitive([])) -
ToPrimitive([])对数组默认调用.toString(),得到空字符串"" -
ToNumber("")将空字符串解析为数字0
常见触发方式和结果
以下写法都会让空数组变成数字 0:
-
+[]→0 -
Number([])→0 -
[] * 1→0 -
1 + []→"1"(注意:这是字符串拼接,因为+遇到字符串优先转字符串,不是数字转换)
和空对象对比更清楚
空对象 {} 表现不同:
-
+{}→NaN(因为{}.toString()是"[object Object]",无法转成有效数字) -
Number({})→NaN - 而
[]的.toString()是"",所以能顺利转成0
实际开发中要注意什么?
这个行为容易引发隐式 bug,尤其在判断或计算场景:
- 不要依赖
if (+arr)来判断数组是否“有内容”,因为+[1]是1(真),+[]是0(假),看似合理,但[0]也会变成0(假),误判 - 安全判断非空数组请用
Array.isArray(arr) && arr.length > 0 - 需要数值计算前,先明确校验数据结构,避免靠强制转换兜底
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











