所以我正在尝试使用Google Closure Compiler,我注意到它会切换所有相等参数,以便变量始终位于比较的右侧。
所以现在而不是typeof XMLHttpRequest=="undefined"
我有"undefined"==typeof XMLHttpRequest
我有if(null!==a)
而不是if(a!==null)
,就像一些例子一样。
我知道他们完成了同样的事情,但这不是我习惯的风格。切换后会有什么好处吗?我看不出会有什么。
有人可以向我解释为什么Closure Compiler决定这样做?这只是编写Closure部分的人的偏好吗?
编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践。没关系,但这是编译后的 。是否有性能优势,或者Closure Compiler只是试图证明这一点?
答案 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)
编译器切换顺序的原因很简单:使用gzip可以更好地压缩。编译器不关心提高理解力或使编辑更容易。通过切换顺序公共比较,例如“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)
只是廉价替代静态分析特殊情况下的常见错误/