12

所以我正在尝试使用 Google Closure Compiler,我注意到它会切换我所有的相等参数,以便变量始终位于比较的右侧。

所以现在代替typeof XMLHttpRequest=="undefined"I have"undefined"==typeof XMLHttpRequest和 I have if(null!==a)instead of if(a!==null),就像一些例子一样。

我知道他们完成了同样的事情,但这不是我习惯的风格。切换这些是否有某种好处?我看不出会怎么样。

有人可以向我解释为什么 Closure Compiler 决定这样做吗?这只是写闭包那部分的人的偏好吗?

编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践。没关系,但这是在编译之后。有性能优势还是闭包编译器只是试图证明一个观点?

4

6 回答 6

12

通常用 C / C++ 等语言完成,所以你不会意外地这样做

if (a = null) {
    // sets a to null and everyone is happy.
    // but probably meant to check if a is null or not.
    // via (a == null)
}

if (null = a) {
    // won't compile
}
于 2012-11-16T01:42:33.347 回答
11

编译器切换顺序的原因很简单:它使用 gzip 压缩得更好。编译器并不关心提高理解力或使其更易于编辑。通过切换顺序,常见的比较例如 "if (x == null) ... if (y == null) ..." 变成 "if (null == x) ... if (null == y) 。 ..” Gzip 找到“if (null ==" 并能够用单个标记替换它。这不是一个很大的改进,但它在一个大型代码库中加起来。

于 2012-11-16T06:06:15.143 回答
3

是的,您不能分配给常量,并且==很容易输入错误(有时您可能会忘记一个,然后使用=)。

例如,有什么区别...

if (a == 1) { }

...和...

if (a = 1) { }

? 第二个总是评估为,不管值是多少a

如果你翻转 LHS 和 RHS,你可以看到直接的好处......

if (1 == a) { }

...将按预期工作并且...

if (1 = a) { }

...将失败,因为您不能分配给常量。

于 2012-11-16T01:41:51.050 回答
3

我知道的原因是为了防止

if (x = 5) { }

如果你把它反转为

if (5 = x) { }

你会得到一个编译器错误。

但是如果你把它写成

if (5 == x) { }

它会编译得很好。

于 2012-11-16T01:44:02.943 回答
1

我的大脑解析

if( x < y )

略快于

if( y > x )

可能是因为实轴始终从左到右定向,从而使条件更易于可视化。

但是,在java中编写更实用

if( "string".equals(x) ) {...

与“更自然”相反

if( x.equals("string") ) {...

消除任何 NPE 的机会。

于 2012-11-16T01:49:26.160 回答
1

只是对常见错误的特定情况的静态分析的廉价替代/

于 2012-11-16T04:40:57.853 回答