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

Why does the closure compiler create void 0 instead of shorter alternatives?

比较这些字符串:

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

为什么Closure Compiler会生成

void 0

什么时候可以生成

[][0]

{}[0]

甚至

[].a

正如虎三郎所说 哪个短了 1 个字符?

{}[0] 不会(总是?请参阅评论)return 未定义,并且 [][0] 理论上可以 return 除了未定义之外的其他内容,因为您可以覆盖 Array constructors/getters.

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

void 0 可能在各种 JavaScript 运行时更快。它不必构造对象或数组并取消引用不存在的 属性.

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

慢得多

请记住,JavaScript 代码通常以压缩形式下载,如果 void 0 出现在多个地方,它们可能会被压缩。

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