网站首页 > 技术文章 正文
在 JavaScript 的世界里,undefined 是一个我们再熟悉不过的原始值。它代表着“未定义”,无论是声明了但未赋值的变量,还是函数没有返回值,我们都能看到它的身影。
let a;
console.log(a); // undefined
function doNothing() {}
console.log(doNothing()); // undefined
然而,你可能在一些高质量的库(如 React, Vue, Lodash)或者一些代码压缩工具的产物中,看到一个奇怪的写法:void 0。
// 某个库的源码片段
function A(props) {
return props.foo === void 0? 'default' : props.foo;
}
这段代码里的 void 0 到底是什么?它和 undefined 有什么区别?为什么这些大神级的项目会选择用它来代替我们熟悉的 undefined 呢?
这不仅仅是一个“茴香豆有四种写法”的无聊问题,其背后揭示了 JavaScript 早期设计的一个“历史遗留问题”,理解它能让你对这门语言有更深刻的认识。
undefined的“黑历史”:它不是一个关键字
在 JavaScript 中,像 true, false, null 都是关键字(Keywords),你不能把它们当作变量名来赋值。不信你试试:
true = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment
但 undefined 在设计之初,却不是一个关键字,而是一个挂载在全局对象(浏览器中是 window)上的一个普通属性。
这意味着什么?undefined 可以被重写!
在早期的 JavaScript(非严格模式下)或者一些古老的浏览器环境中,你可以写出下面这种让人匪夷所思的代码:
// 在非严格模式下
var undefined = 'Hello, I am a bug!';
let a;
if (a === undefined) {
// 这段代码将不会执行!
console.log('a is undefined');
} else {
console.log('a is not undefined, it is:', a);
console.log('And the "undefined" is:', undefined);
}
// 输出:
// a is not undefined, it is: undefined
// And the "undefined" is: Hello, I am a bug!
想象一下,如果你的项目中不小心(或者被恶意地)引入了一段重写了 undefined 的代码,那么所有依赖 undefined 进行的判断都将失效,这将是一场灾难!
虽然在现代 JavaScript 的 ES5 之后,全局的 undefined 属性被设定为只读(writable: false),你无法再给它赋值。
// 现代浏览器控制台
undefined = 123;
console.log(undefined); // 仍然是 undefined
但是,这并不能阻止你在局部作用域中声明一个名为 undefined 的变量:
function aDangerousFunction() {
let undefined = 'oops'; // 局部变量 undefined
let value;
if (value === undefined) { // 这里的比较将是 value === 'oops'
console.log('判断出错!');
}
}
aDangerousFunction();
这种可能性虽然微乎其微,但对于一个需要保证绝对健壮性的库来说,任何潜在的风险都必须被规避。
void操作符:永远返回 undefined的安全选择
现在,让我们来看看 void。
void 是 JavaScript 中的一个一元操作符,它的作用是执行它后面的表达式,然后永远返回 undefined。
console.log(void 1); // undefined
console.log(void 'hello'); // undefined
console.log(void (1 + 1)); // undefined
console.log(void (alert('hi'))); // 先弹窗 'hi',然后返回 undefined
因为 void 是一个操作符(就像 +, -, typeof 一样),而不是一个可以被重写的变量,所以它具有绝对的安全性。无论在什么环境下,void 后面跟上任何表达式,其结果永远是纯正、可靠的 undefined。
而 void 0 只是众多写法中最简洁的一种(相比于 void(0) 或 void 'any')。数字 0 是最短的表达式之一,所以大家约定俗成地使用它。
那么,哪个更好?
- 从安全性角度:void 0 完胜。它能 100% 保证返回的是真正的 undefined,不受任何外部环境污染。这是为什么高质量库和代码压缩工具偏爱它的核心原因。
- 从代码压缩角度:void 0 比 undefined 更短,能节省几个字节。对于大型项目和库来说,积少成多,这也是一个考量点。
- 从日常开发和可读性角度:直接使用 undefined 更好。在现代开发环境中(ES5+,使用 linter),undefined 被意外重写的风险几乎为零。为了团队协作和代码的清晰易懂,直接写 undefined 是完全没问题的,也更符合直觉。
猜你喜欢
- 2025-07-23 ASP.NET MVC+Bootstrap个人博客之文章打赏(六)
- 2025-07-23 网页文字无法复制,教你一招解决!
- 2025-04-26 佛国佛塔佛缘--缅甸(1)
- 2025-04-26 无聊了?玩玩这个任意摧毁破坏网页的小游戏吧!
- 2025-04-26 js函数常见的写法以及调用方法
- 2025-04-26 网页文本禁止复制粘贴?教你6个方法,轻松搞定!你学不学?
- 2025-04-26 涨停王者千机令博客的博客
- 2025-04-26 JavaScript 实现点击/关闭全屏
- 2025-04-26 镇安冷安路拓宽建设 沿途暂时实行交通管制
- 2025-04-26 汽车维基:长安(福特)哈飞风波引发强烈关注 欢迎后台继续爆料
- 1517℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 594℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 521℃MySQL service启动脚本浅析(r12笔记第59天)
- 489℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 456℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
-
- PS所有滤镜的说明(六)(ps滤镜详解)
- 5款小白也能用的在线图片编辑器!电商效率飙升就靠它!
- Java变量(java变量有什么作用)
- Java面试常见问题:Java注解(java中的面试题)
- Java编程入门第一课:HelloWorld(java编程从入门到实践)
- Java基础教程:Java继承概述(java里继承的概述)
- java基础之——访问修饰符(private/default/protected/public)
- 如何规划一个合理的JAVA项目工程结构
- 将机器指令翻译成 JavaScript -- 终极目标
- Web 服务器基准测试:Go vs. Node.js vs. Nim vs. Bun
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)