undefined是引擎自动赋的未初始化值,null是开发者主动设的空状态;前者表“未定义”,后者表“有意为空”,类型、转换行为及判断方式均不同。

核心就一句话:undefined 是“还没给值”,null 是“我主动清空了”。不是谁更“空”,而是“谁让它空的”——是语言自动填的默认占位符,还是开发者亲手写的空状态。
来源不同:引擎默认 vs 人为主动
undefined 是 JavaScript 引擎在运行时自动补上的:
- 变量声明了但没赋值:
let x;→x就是undefined - 函数没写
return:function f() {}→f()返回undefined - 访问对象不存在的属性:
{name: 'A'}.age→undefined - 调用函数时漏传参数:
function g(a) { return a; }→g()中a是undefined
null 则必须由开发者显式写出:
- 释放大对象引用:
data = null;(提示 GC 可回收) - 初始化将来存对象的变量:
let user = null;(明确表示“当前无用户”,不是“还没查”) - 函数找不到结果时返回:
findUser(999) || null(语义清晰:“查无此人”,而非“可能出错了”) - DOM 查询失败:
document.getElementById('missing')返回null(本该存在却没拿到)
类型与行为差异:不只是名字不同
typeof undefined 返回 "undefined",准确反映其身份;typeof null 却返回 "object"——这是早期设计 bug,但恰恰暗示了它的原始意图:一个“空的对象引用”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
它们在运算中也表现迥异:
-
Number(undefined)→NaN(未定义,无法合理转为数字) -
Number(null)→0(空引用,在数值上下文中被当作零处理) -
null == undefined为true(宽松相等只认“无”的语义) -
null === undefined为false(严格相等拒绝混淆:一个是手动设的空指针,一个是引擎给的未初始化标记)
判断时怎么不踩坑
别依赖 == 或 typeof 单独判断:
- 检查是否为
null:用value === null - 检查是否为
undefined:推荐typeof value === 'undefined'(比value === undefined更安全,避免未声明变量报错) - 检查是否为空值(null 或 undefined):直接用
value == null(简洁、可靠、规范认可)
用法选择的关键信号
写代码时问自己一个问题:这个“空”是程序自然走出来的,还是我特意放进去的?
- 如果是“还没来得及填”“系统刚建好还没动它”“属性本来就不该有”——选
undefined - 如果是“我决定清掉它”“这里本该有对象但此刻没有”“我要明确告诉调用方‘无结果’”——选
null
混用会模糊语义。比如用 undefined 表示 API 查询失败,调用方无法区分是网络错误、字段缺失,还是真没数据;而用 null 初始化一个未声明的变量,则根本通不过语法检查。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










