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

Nat*_*han 12 javascript google-closure-compiler

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

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

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

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

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

Joh*_*136 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
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,任何体面的编译器(或脚本语言中的lint风格工具)在使用`if(a = null)`时都会显示警告,除非你通过使用`if((a = null)明确表达你的意图)` (9认同)

Joh*_*ohn 11

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

  • 这是问题所在:http://code.google.com/p/closure-compiler/issues/detail?id = 461.像这样的增强功能在Google的代码库(几乎所有主要产品,如地图和gmail)上进行了测试. (2认同)