JavaScript不再需要写void 0了

我们经常会在一些代码中看到void 0的写法,这种写法其实现在已经不需要了

本文翻译自:https://p42.ai/blog/2022-05-10/you-dont-need-void-0

void操作符执行一个表达式并返回原始值undefinedvoid 0执行0,这什么都不会发生并且会返回undefined。是undefined的别名

为什么void 0会用来当作undefined的别名?

undefined本身不是一个保留关键字而是一个全局对象的一个属性

在ES5(2009)之前,全局属性undefined的值是能被修改的,这会导致undefined一些不符合预期的行为

下面的例子(这在现在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 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值