平等操作数的顺序是否重要? (例如1 == x vs x == 1)

时间:2012-11-16 01:39:39

标签: javascript google-closure-compiler

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

所以现在而不是typeof XMLHttpRequest=="undefined"我有"undefined"==typeof XMLHttpRequest我有if(null!==a)而不是if(a!==null),就像一些例子一样。

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

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

编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践。没关系,但这是编译后的 。是否有性能优势,或者Closure Compiler只是试图证明这一点?

6 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:11)

编译器切换顺序的原因很简单:使用g​​zip可以更好地压缩。编译器不关心提高理解力或使编辑更容易。通过切换顺序公共比较,例如“if(x == null)... if(y == null)...”变为“if(null == x)... if(null == y)”。 ..“Gzip发现”if(null ==“并且能够用单个标记替换它。它不是一个很大的改进,但它在一个大的代码库中加起来。

答案 2 :(得分:3)

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

例如,......

之间的区别是什么
if (a == 1) { }

...和...

if (a = 1) { }

?第二个将始终评估为 true ,而不管a的值是什么。

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

if (1 == a) { }

......将按预期工作......

if (1 = a) { }

...会失败,因为你无法分配常数。

答案 3 :(得分:3)

我知道的原因是为了防止

if (x = 5) { }

如果将其反转为

if (5 = x) { }

您将收到编译器错误。

但如果你把它写成

if (5 == x) { }

它编译得很好。

答案 4 :(得分:1)

我的大脑解析

if( x < y )

略快
if( y > x )

可能是因为实轴总是从左到右定向,因此使条件更容易可视化。

但是,在java中编写

更实用
if( "string".equals(x) ) {...

而不是“更自然”

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

消除NPE的任何机会。

答案 5 :(得分:1)

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