Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript缩小比较语句_Javascript_Google Closure Compiler_Minify - Fatal编程技术网

Javascript缩小比较语句

Javascript缩小比较语句,javascript,google-closure-compiler,minify,Javascript,Google Closure Compiler,Minify,我正在查看Close生成的一个缩小的js文件。我发现无论我在哪里检查变量和字符串之间的相等性 a == "13" || a == "40" 闭包将其替换为 "13" == a || "40" == a 为什么要进行这种修改?这里有一些性能优势吗?[更新:请参阅@John的答案,这更能说明为什么js minifier会这样做,并且应该是公认的答案] 作为一般概念,这是为了避免程序员错误。如果手动修改代码并将变量放在第一位,常量放在第二位,则可能会意外键入: a == '40' || a = '

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

a == "13" || a == "40"
闭包将其替换为

"13" == a || "40" == a
为什么要进行这种修改?这里有一些性能优势吗?

[更新:请参阅@John的答案,这更能说明为什么js minifier会这样做,并且应该是公认的答案]

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

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

'40' == a || '13' = a
将引发异常,因为无法在赋值操作的左侧放置常量字符串

因此,在一些思想流派中,最好的做法是在与常数进行相等比较时,总是将常数放在左边。看起来结束就是这样

这些被称为“尤达条件”


请注意,我个人的偏好是,在大多数情况下,实际上只是将常量放在右边,因为代码的可读性更好,所以我认为折衷还不够好。但我看到了yoda条件背后的逻辑。

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

这并不能解释压缩机为什么会这样做。OT:他们真的删除了吗?!压缩机尽可能使用最佳实践,因为它可以。(也许有人会编辑缩小版?)而且,我不知道关于尤达状况的线索。我以前就听过这样的描述,在这里的文档()中,他们提到除了最小化之外,编译器还对代码实践持固执态度,它甚至可以警告您一些事情。在本例中,它似乎只是默默地将这些比较转换为yoda格式。@Pumbaa80,我发布了一个元主题,询问是否有可能恢复您指出的线程。有道理。OP(@user843241)应将此更改为已接受的答案。我会删除我自己的答案,但我不知道这是否符合犹太教。虽然只是记录在案,但Yoda条件从未说明赋值操作数的顺序;当然,你永远不会把“x=2”变成“2=x”。Yoda条件仅与相等比较的操作数顺序有关。