我们经常会在一些代码中看到void 0
的写法,这种写法其实现在已经不需要了
本文翻译自:https://p42.ai/blog/2022-05-10/you-dont-need-void-0
void操作符执行一个表达式并返回原始值undefined。void 0
执行0
,这什么都不会发生并且会返回undefined
。是undefined
的别名
为什么void 0
会用来当作undefined
的别名?
undefined
本身不是一个保留关键字而是一个全局对象的一个属性
在ES5(2009)之前,全局属性undefined
的值是能被修改的,这会导致undefined
一些不符合预期的行为
下面的例子(这在现在JavaScript引擎中已经不是这样了)
代码语言:javascript复制// 修改全局对象中的undefined属性
undefined = "something else";
// 在其它js文件或者script中
if (aVariable === undefined) {
doSomething();
}
修改全局的undefined
可能发生在第三方代码中,例如通过脚本标签导入的库。由于void 0
总是返回undefiend
的实际原始值,因此在ES5之前通常使用它来在防止全局undefined
被修改的情况下仍能确保undefined
判断的准确性
ES5之后的全局属性undefined
undefined
可以在全局对象上被修改的问题很大,以至于JavaScript标准在ES5中改变了。在ES5中,全局属性undefined
变成了只读。尝试更改更改undefined的值在现代JavaScript中没有任何作用
globalThis.undefined = "something else";
console.log(undefined); // 在现代JS引擎中打印undefined
undefined
仍然可以被局部变量覆盖
虽然不再能更改全局属性undefined
,但undefined
仍然不是JavaScript中的保留关键字。因此它仍然可以被局部变量覆盖
{
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
)的情况下也更易于阅读
在现代JavaScript中避免使用void 0
总之,在现代浏览器和JavaScript引擎中没有理由再使用void 0
- 全局属性
undefined
不能在ES5以及后续的环境中更改 - 本地变量命名
undefined
可以通过ESLint规则no-undefined进行禁止 - 生产环境打包时minifier工具可以将
undefined
替代成void 0
实现体积优化
相反,void 0
使JavaScript代码更难阅读,因为需要知道void 0
的含义并处理相同概念(undefined
)的不同术语(void 0
,undefined
)
结论:使用undefined
并移除不必要的void 0