为什么闭包编译器会创建void 0而不是更短的替代?

时间:2017-06-17 17:56:06

标签: javascript google-closure-compiler

比较这些字符串:

{}[0]
[][0]
void 0

为什么Closure Compiler生成

void 0

什么时候可以生成

[][0]

{}[0]

甚至

[].a
如同torazaburo提到的那样 哪个短1个字符?

2 个答案:

答案 0 :(得分:4)

最小代码大小不是Closure编译器的唯一目标。另一个目标(我假设)是生成与原始代码一样快的代码。

在各种JavaScript运行时中,

void 0可能会更快。它不必构造对象或数组并取消引用不存在的属性。

JavaScript运行时引擎可能会优化{}[0][][0],但为什么Closure编译器要依赖它?如果那些没有得到优化,那么它们会明显慢于void 0

请注意,JavaScript代码通常以压缩形式下载,如果void 0出现在多个位置,则可能会压缩它们。

另请参阅Blaise的回答,了解另一个不使用{}[0][][0]的理由。

答案 1 :(得分:3)

{}[0]没有(总是?看到注释)返回undefined,并且[][0]理论上可以返回除undefined之外的其他内容,因为您可以覆盖数组构造函数/ getter。