为什么闭包编译器创建 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]
的充分理由。
比较这些字符串:
{}[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]
的充分理由。