原文:https://p42.ai/blog/2022-05-10/you-dont-need-void-0
在Js代码中,尤其在老旧代码里,你有时会发现 void 0 表达式。
void 操作,执行一个表达式,并且返回一个原始值 undefined。void 0 执行表达式 0,这什么也没做,然后就返回一个 undefined。这个表达式等价于 undefined 而且非常有效。
为什么需要它来替代undefined?
在JavaScript, undefined 并不是保留的关键字(怪癖之一)。相反,它只是一个全局对象的属性。
在ES5(2009)年之前,用户代码是可以修改全局属性 undefined ,这可能会导致一些意料之外的行为。
考虑下,的事例(不能在现代的JS引擎里执行):
// Pre-ES5 example - does not work in modern JS engines:
// 改变全局对象的 undefined 属性
undefined = "something else";
// 其他某个地方 可能有这么一个判断
if (aVariable === undefined) {
// 等价于 aAvariable === 'something else'
// 而不是 undefined
doSomething();
}
ES5之后的全局属性 undefined
undefined 能够通过全局属性来修改,是个大问题。以至于之后的ES标准有改变这一行为。在ES5里面,全局属性 undefined 是一个只读属性,在现代JS引擎里,尝试去改变这个值,他将什么也不做。
globalThis.undefined = "something else";
console.log(undefined); // 在现代JS环境里面,打印的是 undefined
undefined 依然能够被一个本地变量所覆盖
尽管现在不能直接改变 undefined ,但是它在JS里依旧不是一个保留关键字。因此,它仍然能够被一个本地变量所覆盖。
const undefined = "something else";
let check = aVariable === void 0; // void 0 在这里是必要的
有一个叫 undefined 的本地变量名,是你需要极力避免的一个陷阱。ESlint中的 no-undefined 规则不允许使用 undefined 作为变量名,去避免这种被覆盖的问题。
Void 0能够减少打包尺寸吗?
表达式 void 0 比 undefined 要短。JavaScript的尺寸,对于创建一个需要快速加载的网站是非常重要的。并且剃掉部分字符是很有用的。
但是, 最好还是把基本代码的压缩优化(Terser)作为生产打包的一部分。它们能够做很多不同的优化,并且使源代码依旧保留着可读性,而不需要任何手动的对代码做大小优化。例如使用 void 0 代替 undefined。
在现在JS环境里避免使用 void 0
总结一下,在现代浏览器和JS引擎中,不再有任何理由使用void 0。
- 在ES5之后,全局属性 undefined 不能被修改
- 本地变量名覆盖的问题,能被 ESlint的 no-undefined规则禁用掉
- 代码压缩能够替换 undefined 为 void 0,当我们构建生产代码时
在另一方面, void 0使得JavaScript代码难以阅读和理解,因为你需要知道 void 0 意味着什么,以及对同一个概念处理两个不同的东西(undefined、void 0)。
你完全可以使用 undefined 而不是 void 0