【问题标题】:Javascript minification of comparison statements比较语句的 Javascript 缩小
【发布时间】:2012-03-04 14:56:01
【问题描述】:

我正在查看由闭包生成的缩小的 js 文件之一。我发现无论我在哪里检查变量和字符串之间的相等性,例如,

a == "13" || a == "40"

闭包替换为

"13" == a || "40" == a

为什么要进行这种修改?这里有一些性能优势吗?

【问题讨论】:

    标签: javascript google-closure-compiler minify


    【解决方案1】:

    [更新:请参阅@John 的回答,这对于为什么 js 缩小器会这样做更有意义,并且应该是公认的答案]

    作为一般概念,这是为了避免程序员错误。如果您手动修改代码并将变量放在第一位,然后将常量放在第二位,则可能会意外键入:

    a == '40' || a = '13'
    

    哎呀!我们只是将a 设置为'13',而不是进行比较。通过把常数放在左边,我们避免了这种可能性:

    '40' == a || '13' = a
    

    将抛出异常,因为您不能将常量字符串放在赋值操作的左侧。

    因此,在某些学派中,最好的做法是在与常数进行相等比较时始终将常数放在左侧。看起来关闭遵循这种做法。

    这些被称为“尤达条件”。

    请注意,我个人的偏好实际上是在大多数情况下将常量放在右侧,因为代码往往读起来更好,所以我认为权衡不够好。但我看到了尤达条件背后的逻辑。

    【讨论】:

    • 这并不能解释为什么压缩器会这样做。 OT:他们真的删除了thread on Yoda conditions吗?!
    • 压缩器尽可能使用最佳实践,因为它可以。 (可能有人编辑缩小版?)
    • 另外,我不知道那个关于尤达条件的线程。我以前听说过这种说法。
    • 在此处的文档 (code.google.com/speed/articles/compressing-javascript.html) 中,他们提到除了缩小之外,编译器还对代码实践有意见,它甚至可以警告您。在这种情况下,它看起来只是默默地将这些比较转换为 yoda 格式。
    • @Pumbaa80,我发布了一个元主题,询问是否有可能恢复你指出的那个线程。 meta.stackexchange.com/questions/122154/…
    【解决方案2】:

    这样做是为了获得较小的 gzip 压缩优势。如果你有“x == 1”和“1 == x”,编译器在这两种情况下都将它切换为“1 == x”,你会得到更多压缩更好的常规代码。胜利是如此之小,以至于我考虑过删除代码并节省 cpu 周期,但它现在还在。它与防止程序员错误无关,因为它永远不会将“x = 2”切换为“2 = x”,因为这会改变程序的含义。

    【讨论】:

    • 有道理。 OP (@user843241) 应该将其更改为接受的答案。我会删除我自己的答案,但我不知道这是否符合犹太教规。尽管只是为了记录,Yoda Conditions 从未提及赋值操作数的顺序。当然,您永远不会将“x = 2”更改为“2 = x”。 Yoda 条件仅关于相等比较的操作数顺序。
    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多