
我们经常会在一些代码中看到void 0的写法,这种写法其实现在已经不需要了
void操作符执行一个表达式并返回原始值undefined。void 0执行0,这什么都不会发生并且会返回undefined。是undefined的别名
为什么void 0会用来当作undefined的别名?
undefined本身不是一个保留关键字而是一个全局对象的一个属性
在ES5(2009)之前,全局属性undefined的值是能被修改的,这会导致undefined一些不符合预期的行为
下面的例子(这在现在JavaScript引擎中已经不是这样了)
1 | // 修改全局对象中的undefined属性 |
修改全局的undefined可能发生在第三方代码中,例如通过脚本标签导入的库。由于void 0总是返回undefiend的实际原始值,因此在ES5之前通常使用它来在防止全局undefined被修改的情况下仍能确保undefined判断的准确性
ES5之后的全局属性undefined
undefined可以在全局对象上被修改的问题很大,以至于JavaScript标准在ES5中改变了。在ES5中,全局属性undefined变成了只读。尝试更改更改undefined的值在现代JavaScript中没有任何作用
1 | globalThis.undefined = "something else"; |
undefined仍然可以被局部变量覆盖
虽然不再能更改全局属性undefined,但undefined仍然不是JavaScript中的保留关键字。因此它仍然可以被局部变量覆盖
1 | { |
我们应该避免使用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

- Post title:JavaScript不再需要写void 0了
- Post author:flytam
- Create time:2022-05-23 11:45:39
- Post link:https://blog.flytam.vip/JavaScript不再需要写void 0了.html
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.