JS中两个空之null和undefined深度解析

 更新时间:2026年05月27日 11:34:36   作者:yqcoder  
在JavaScript中,null和undefined都是表示无或者空的值,但它们之间存在一些重要的区别,这篇文章主要介绍了JS中两个空之null和undefined的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

为什么会有两个“空”?

在很多语言(如 Java、C#)中,通常只有一个 null 来表示“无”。但在 JavaScript 中,Brendan Eich(JS 之父)设计了两个:

  1. undefined:表示**“缺失”**。系统自动分配的,意思是“这里应该有个值,但现在还没给”。
  2. null:表示**“空无”**。开发者手动设置的,意思是“这里本来可以有值,但我特意把它清空了”。

通俗比喻
想象你去餐厅点餐:

  • undefined:你坐在座位上,服务员还没给你菜单。状态是“未定义”,你不知道有什么菜,因为流程还没走到那一步。这是系统/环境造成的。
  • null:服务员给了你菜单,你看了一圈说:“我什么都不想要,给我来个空盘子。” 状态是“空”,是你主动选择的结果。

1. 核心区别对比表

特性undefinednull
含义未定义、缺失、尚未赋值空对象指针、有意为空
来源系统/引擎自动分配开发者手动赋值
类型 (typeof)"undefined""object" (历史 Bug)
数值转换NaN0
布尔转换falsefalse
相等性undefined == null (true)undefined === null (false)

2. 深度解析:undefined的场景

undefined 通常出现在以下几种“被动”场景中:

场景 1:变量声明但未赋值

let name;
console.log(name); // undefined

场景 2:访问对象不存在的属性

const user = { name: "Alice" };
console.log(user.age); // undefined (属性不存在)

场景 3:函数没有返回值

function doNothing() {}
console.log(doNothing()); // undefined

场景 4:函数参数未传递

function sayHi(name) {
  console.log(name);
}
sayHi(); // undefined

关键点undefined 代表**“意料之外的缺失”“初始状态”**。

3. 深度解析:null的场景

null 通常出现在以下“主动”场景中:

场景 1:初始化一个将来会存放对象的变量

let currentUser = null; // 明确表示当前没有用户

// ... 后续逻辑 ...
if (loginSuccess) {
  currentUser = { id: 1, name: "Bob" };
}

场景 2:释放内存引用(垃圾回收提示)

当一个对象不再需要时,将其引用设为 null,有助于 GC(垃圾回收器)识别并回收内存。

let largeData = new Array(1000000).fill("data");
// 使用完毕...
largeData = null; // 断开引用,帮助内存回收

场景 3:API 返回“无结果”

后端接口查询数据库,如果没有找到记录,通常返回 null 而不是 undefined,因为 null 是一种明确的业务状态(“查了,但没有”)。

关键点null 代表**“意料之中的空”“主动清空”**。

4. 类型检测的“历史遗留问题”

为什么typeof null === 'object'?

这是一个著名的 JavaScript Bug,源自 JS 诞生的早期版本。
在底层实现中,JS 变量的类型标签存储在低位比特中:

  • 000: 对象 (object)
  • 001: 整数 (int)
  • 010: 浮点 (double)
  • 100: 字符串 (string)
  • 110: 布尔 (boolean)

null 的机器码全为 0 (000000)。因此,它的类型标签也是 000,被误判为 object

由于修复这个 Bug 会导致大量旧网站崩溃,所以 Brendan Eich 决定将错就错,保留至今。

如何正确判断null?

不要只用 typeof,要结合严格相等判断:

function isNull(value) {
  return value === null;
}

function isUndefined(value) {
  return value === undefined;
}

// 或者判断是否为“空值”(null 或 undefined)
function isNil(value) {
  return value == null; // 利用 == 的特性:null == undefined 为 true
}

5. 实战:如何优雅地处理空值?

在现代 JavaScript (ES2020+) 中,我们有更优雅的工具来处理这两个家伙。

技巧 1:空值合并运算符 (??)

当你希望只有在值为 nullundefined 时才使用默认值,而保留 0''false 时使用:

const config = {
  count: 0,
  name: null,
};

// ❌ 使用 || (逻辑或) 的陷阱:0 会被当成 false
console.log(config.count || 10); // 10 (错误!我们想要 0)

// ✅ 使用 ?? (空值合并)
console.log(config.count ?? 10); // 0 (正确!只有 null/undefined 才替换)
console.log(config.name ?? "Guest"); // "Guest"

技巧 2:可选链操作符 (?.)

安全地访问深层嵌套属性,避免 Cannot read property of undefined 报错。

const user = {
  address: null,
};

// ❌ 传统写法,如果 address 是 null,会报错
// console.log(user.address.street.length);

// ✅ 可选链:如果中间任何一环是 null/undefined,直接返回 undefined
console.log(user.address?.street); // undefined (不会报错)
console.log(user.profile?.name); // undefined (profile 不存在)

6. 总结

维度undefinednull
本质缺少值 (Missing)空值 (Empty)
谁给的?JS 引擎程序员
何时用?变量未初始化、属性不存在显式清空、初始化对象变量
推荐用法尽量让系统自动产生,少手动赋值主动赋值,表示“此处无物”

🚀 博主寄语
虽然 null == undefinedtrue,但在代码规范中,建议严格区分它们。

最佳实践原则

  1. 默认值检查:使用 ?? 操作符。
  2. 安全访问:使用 ?. 操作符。
  3. 变量初始化:如果变量将来要存对象,初始化为 null;如果只是声明,让它保持 undefined
  4. API 设计:后端返回“无数据”时用 null,前端判断时用 == null 同时捕获两者。

理解这两个“空”,能让你写出更健壮、更少 Bug 的代码。

到此这篇关于JS中两个空之null和undefined的文章就介绍到这了,更多相关JS空null和undefined内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论