Null转数字恒为0,Undefined转数字恒为NaN;二者虽同为falsy值,但Number(null)为0而Number(undefined)为NaN且不等于自身,应避免隐式转换而用??、校验或parseInt等显式处理。

在 JavaScript 中,Null 转为数字是 0,Undefined 转为数字是 NaN。这是由规范明确定义的抽象操作 ToNumber 决定的,不是隐式“猜测”,而是有固定规则。
Null → 数字:固定为 0
无论上下文如何,只要对 null 执行 ToNumber(例如 +null、Number(null)、参与算术运算),结果一定是 0。
-
+null→0 -
Number(null)→0 -
null * 5→0 -
null === 0→false(注意:相等比较不触发 ToNumber,而是用另一套抽象相等算法)
Undefined → 数字:固定为 NaN
undefined 在 ToNumber 过程中始终返回 NaN,且该 NaN 不与任何值相等(包括它自己)。
-
+undefined→NaN -
Number(undefined)→NaN -
undefined - 10→NaN -
isNaN(undefined)→true(因为Number(undefined)是NaN)
和布尔转换不要混淆
有人误以为“falsy 值转数字都一样”,其实不然:
-
Boolean(null)和Boolean(undefined)都是false(它们都是 falsy) - 但
Number(null) === 0,而Number(undefined) !== 0,甚至Number(undefined) !== Number(undefined) - 所以不能靠真假值推断数字转换结果
实际开发中的建议
避免依赖隐式转换,尤其涉及 null 和 undefined 时:
- 需要默认值?用
??(空值合并):Number(value ?? 0) - 做安全计算?先校验:
if (value == null) throw new Error('Expected number') - 解析用户输入?优先用
parseInt或parseFloat,它们对null/undefined返回NaN(和Number()一致,但语义更明确)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











