专栏-null 和 undefined 到底是什么?

专栏-null 和 undefined 到底是什么?

很多人第一次学 JavaScript,都会被这两个东西绕住:

javascript 复制代码
null
undefined

看起来都像"没有值",为什么要搞两个?

我以前一直对这种 none/null/undefined 一类的东西很不理解。

不是因为它多复杂。

而是因为一直没人直接告诉我:

这玩意本质上就是语言提前放好的一个全局标记,一个哨兵。

关键先别把它们想得太神秘。

它们本质上都只是标记值 ,也可以叫哨兵值

text 复制代码
正常值
-> 真正的数据

标记值
-> 用来说明这里现在没有正常数据

问题不在于"空不空",而在于:

这个"没有",到底是谁放进去的?


一、nullundefined 分别在标记什么?

null 是程序员主动放进去的标记。

比如:

javascript 复制代码
const user = null;

这不是"还没值"。

而是:

我明确告诉程序,这里现在就是没有正常对象。

所以 null 更像是:

text 复制代码
人主动写进去的"没有"

undefined 不一样。

它通常不是你主动放的,而是 JavaScript 运行过程中自动给出来的结果。

比如:

javascript 复制代码
let x;
console.log(x); // undefined
javascript 复制代码
const obj = {};
console.log(obj.age); // undefined
javascript 复制代码
function f() {}
console.log(f()); // undefined

这些情况的共同点都一样:

这个位置是合法的,但程序最后没有拿到正常值。

所以可以把它压成一句话:

text 复制代码
null
-> 人主动标记"这里没有值"

undefined
-> 语言自动标记"这里没产生出值"

顺手再补一个最容易混的边界:

undefined 不是"变量根本不存在"。

javascript 复制代码
let x;
console.log(x); // undefined

这里变量是存在的,只是没值。

但如果你直接访问一个没声明过的变量,通常还是会报 ReferenceError


二、为什么很多语言只有 null,没有 undefined

因为很多语言根本不让你去读这种"还没产生值"的位置。

它们的处理方式不是:

text 复制代码
没值
-> 给你一个特殊值

而是:

text 复制代码
没值
-> 直接报错

比如在不少语言里:

  • 局部变量没初始化就不能读
  • 变量没声明就不能用
  • 本来该返回结果却没结果,会直接当成错误处理

既然这些情况都已经被错误机制拦住了,那就没必要再额外设计一个 undefined

所以很多语言最后只保留一种"空标记":

text 复制代码
null / nil / None

它表示的不是"程序没算出来",而是:

程序允许这里合法地没有对象。

这就是核心区别:

text 复制代码
很多语言:
主动表示没有
-> null

本来该有值但没产生
-> 直接报错
text 复制代码
JavaScript:
主动表示没有
-> null

没产生出值
-> undefined

所以 undefined 不是比 null 多了一种"空"。

它只是说明:

JavaScript 选择把"没产生出值"这件事,也做成了一个可以继续传递、继续判断的值。


三、把它当成一种"错误码设计",就更容易想通了

如果到这里还是觉得绕,可以再换一个更实用的角度理解:

说白了,这就是一种错误码设计,只不过它不是放在异常系统里,而是直接放在值系统里。

很多系统都会干这件事。

正常情况返回正常结果。

特殊情况不立刻中断,而是返回一个提前约定好的标记,让你自己继续判断。

比如:

text 复制代码
查到了
-> 返回真实对象

没查到
-> 返回 null
text 复制代码
拿到了属性值
-> 返回真实值

这个位置没有值
-> 返回 undefined

从这个角度看,nullundefined 其实没有那么特殊。

它们只是语言提前给你准备好的两个状态码。

而且理论上完全可以继续细分。

比如一门语言如果愿意,甚至还可以再造几个专门的标记:

text 复制代码
参数没传
-> 一个标记

属性不存在
-> 一个标记

函数没返回结果
-> 一个标记

只是 JavaScript 没继续细分,而是把很多场景都压到了 undefined 里。

很多别的语言走的是另一条路:

它们连这个标记都不想给,直接把这些情况判成错误。

所以最后你看到的表面现象才会是:

text 复制代码
JavaScript
-> null + undefined

很多别的语言
-> 只有 null

但本质上不是 JavaScript 多了一种神秘的空值。

而是它多保留了一类"缺值状态",并把它做成了一个可以继续传递的值。

相关推荐
小徐_233316 分钟前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·微信小程序·uni-app
kyriewen31 分钟前
Claude自己跑出去hack了3家公司——我为什么还在用它写代码
前端·ai编程·claude
IT_陈寒37 分钟前
SpringBoot自动配置的坑,这次真踩疼我了
前端·人工智能·后端
shengjk137 分钟前
AI Engineering 五代演进史:Prompt、RAG、Agent 到 Graph 的架构革命
后端
子兮曰1 小时前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端
程序员黑豆1 小时前
鸿蒙应用开发之@Styles 装饰器:定义可复用的组件样式
前端·harmonyos
程序员码歌1 小时前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
咩咩啃树皮1 小时前
第52篇:前端工程化完整体系精讲——Vite构建、模块化、打包原理、规范体系、面试终极通关
前端·面试·职场和发展
妙码生花1 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
前端·后端·ai编程
FogLetter1 小时前
当JavaScript学会“分身术”:异步编程的进化简史
前端·javascript·面试