null转数字为0、undefined为nan,布尔上下文均falsy但语义不同,字符串转换分别得"null"和"undefined",建议显式判断而非依赖隐式转换。

处理 null 和 undefined 在类型转换时的不同,关键在于理解它们在隐式转换中的行为差异,而不是笼统地用 == 或 Boolean() 一概而论。它们在数字、布尔、字符串上下文中的表现截然不同,直接关系到逻辑是否出错。
数字转换:null→0,undefined→NaN
这是最易踩坑的一点。JavaScript 在执行加法、减法、乘除等算术运算前,会尝试把操作数转为数字:
-
null + 1→0 + 1→1 -
undefined + 1→NaN + 1→NaN -
Number(null)返回0;Number(undefined)返回NaN
这意味着,如果某个函数返回值可能是 null 或 undefined,又参与了数值计算(比如求和、分页偏移量),不提前校验就可能导致静默失败或错误结果。
布尔转换:两者都转为 false,但语义不可混用
在 if、&&、|| 等布尔上下文中,null 和 undefined 都是 falsy 值,会触发相同分支:
-
if (!value) { ... }对两者都成立 -
value || 'default'也会对两者都取默认值
但这只是“结果一致”,不代表可以忽略语义区别。例如:user.profile || {} 能兜底,但如果 profile 是 undefined(属性不存在),说明结构缺失;如果是 null(显式置空),说明业务上主动清空过——后续可能需要不同处理逻辑。
字符串转换:null→"null",undefined→"undefined"
当用于拼接字符串或 String() 转换时:
-
'' + null→"null" -
'' + undefined→"undefined" -
String(null)→"null";String(undefined)→"undefined"
这个差异在日志输出、表单回填、JSON 序列化(JSON.stringify({a: null}) 保留 null,但 {a: undefined} 会被忽略)中尤为明显。若未意识到,可能在调试时看到意料之外的字符串字面量。
安全转换建议:按需显式判断,避免依赖隐式转换
不要指望自动转换“聪明”——它只按规则走,不管你的业务意图。推荐做法:
- 需要数值时,先用
value === null || value === undefined排除,再用Number(value)或parseInt() - 区分语义时,不用
!value,改用value == null(可同时捕获两者)或严格分开判断value === null/value === undefined - 拼接前统一处理:
value ?? ''(空值合并)比'' + value更可控 - 序列化前注意:
JSON.stringify()会丢弃undefined属性值,但保留null,必要时预处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











