【发布时间】:2012-03-04 14:56:01
【问题描述】:
我正在查看由闭包生成的缩小的 js 文件之一。我发现无论我在哪里检查变量和字符串之间的相等性,例如,
a == "13" || a == "40"
闭包替换为
"13" == a || "40" == a
为什么要进行这种修改?这里有一些性能优势吗?
【问题讨论】:
标签: javascript google-closure-compiler minify
我正在查看由闭包生成的缩小的 js 文件之一。我发现无论我在哪里检查变量和字符串之间的相等性,例如,
a == "13" || a == "40"
闭包替换为
"13" == a || "40" == a
为什么要进行这种修改?这里有一些性能优势吗?
【问题讨论】:
标签: javascript google-closure-compiler minify
[更新:请参阅@John 的回答,这对于为什么 js 缩小器会这样做更有意义,并且应该是公认的答案]
作为一般概念,这是为了避免程序员错误。如果您手动修改代码并将变量放在第一位,然后将常量放在第二位,则可能会意外键入:
a == '40' || a = '13'
哎呀!我们只是将a 设置为'13',而不是进行比较。通过把常数放在左边,我们避免了这种可能性:
'40' == a || '13' = a
将抛出异常,因为您不能将常量字符串放在赋值操作的左侧。
因此,在某些学派中,最好的做法是在与常数进行相等比较时始终将常数放在左侧。看起来关闭遵循这种做法。
这些被称为“尤达条件”。
请注意,我个人的偏好实际上是在大多数情况下将常量放在右侧,因为代码往往读起来更好,所以我认为权衡不够好。但我看到了尤达条件背后的逻辑。
【讨论】:
这样做是为了获得较小的 gzip 压缩优势。如果你有“x == 1”和“1 == x”,编译器在这两种情况下都将它切换为“1 == x”,你会得到更多压缩更好的常规代码。胜利是如此之小,以至于我考虑过删除代码并节省 cpu 周期,但它现在还在。它与防止程序员错误无关,因为它永远不会将“x = 2”切换为“2 = x”,因为这会改变程序的含义。
【讨论】: