这是一个更好的选择
在 Javascript 代码中,尤其是在较旧的遗留代码中,您有时会发现表达式 void 0。
void 运算符计算表达式并返回未定义的原始值。 void 0 计算 0,它什么都不做,然后返回 undefined。 它实际上是未定义的别名。
为什么 void 0 用作 undefined 的别名?
Javascript 的一个怪癖是 undefined 不是保留关键字。
相反,它是全局对象的属性。
在 ES5 (2009) 之前,可以修改未定义的全局属性,这可能导致未定义的意外行为。
考虑以下示例(在现代 Javascript 引擎中不起作用):
// Pre-ES5 example - does not work in modern JS engines:// changes property 'undefined' on the global object:undefined = "something else"; // potentially in some other Javascript file or script section:if (aVariable === undefined) { // aVariable is equal to "something else", // but not to the primitive value 'undefined' doSomething();}
修改未定义的全局甚至可能发生在第 3 方代码中,例如通过脚本标签导入的库。 由于 void 0 总是返回未定义的实际原始值,因此在 ES5 之前通常使用它来使代码对未定义的全局属性的重新定义进行故障保护。
ES5 之后的全局属性‘undefined’
undefined 可以在全局对象上修改的问题非常大,以至于 Javascript 标准被改变了。
在 ES5 中,全局属性 undefined 变成了只读的。
尝试更改值在现代 Javascript 中没有任何作用:
globalThis.undefined = "something else";console.log(undefined); // prints undefined in modern browsers
未定义仍然可以被局部变量遮蔽
但是,虽然不再可能更改 undefined 全局属性,但 undefined 仍然不是 Javascript 中的保留关键字。 因此它仍然可以被局部变量遮蔽:
const undefined = "something else";let check = aVariable === void 0; // void 0 is needed here
有一个名称为 undefined 的局部变量是您要避免的陷阱。 ESLint 规则 no-undefined 不允许使用 undefined 作为变量名并防止出现阴影问题。
void 0 可以帮助减小捆绑包的大小吗?
表达式 void 0 比 undefined 短。 Javascript 包大小对于创建快速加载的网站至关重要,减少几个字节会有所帮助。
但是,最好将基本的代码大小优化留给诸如 Terser 之类的压缩程序,作为产品捆绑过程的一部分。 它们可以执行许多不同的优化,并且源代码仍然更具可读性,无需任何手动代码大小优化,例如使用 void 0 而不是 undefined。
在现代 Javascript 中避免使用 void 0
总而言之,在现代浏览器和 Javascript 引擎中,没有理由再使用 void 0 了:
- 全局属性 undefined 在 ES5 和更新的环境中无法更改
- 使用 ESLint 规则 no-undefined 可以禁止名称为 undefined 的局部变量
- 在创建生产包时,缩小器可以用 void 0 替换 undefined
相反,void 0 使 Javascript 代码更难阅读和理解,因为您需要知道 void 0 的含义,并为同一概念 (undefined) 处理不同的术语 (void 0, undefined)。
您可以使用 undefined 并删除不必要的 void 0 并发症。
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com