JavaScript不再需要写void 0了

2022-05-25 15:58:58 浏览数 (1)

我们经常会在一些代码中看到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中没有任何作用

代码语言:javascript复制
globalThis.undefined = "something else";
console.log(undefined); // 在现代JS引擎中打印undefined
undefined仍然可以被局部变量覆盖

虽然不再能更改全局属性undefined,但undefined仍然不是JavaScript中的保留关键字。因此它仍然可以被局部变量覆盖

代码语言:javascript复制
{
  const undefined = "something else";
  let check = aVariable === void 0; // 这里的void 0仍需要
}

我们应该避免使用undefined作为变量名。ESLint规则no-undefined 不允许使用 undefined 作为变量名并防止出现覆盖问题

void 0是否有助于减少打包体积?

表达式void 0undefined短。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

0 人点赞