Javascript 相等中的操作数顺序重要吗?(例如:1==x vs x==1)
所以我在试用Google闭包编译器,我注意到它会切换我所有的相等参数,这样变量总是在比较的右边 因此,现在我没有使用Javascript 相等中的操作数顺序重要吗?(例如:1==x vs x==1),javascript,google-closure-compiler,Javascript,Google Closure Compiler,所以我在试用Google闭包编译器,我注意到它会切换我所有的相等参数,这样变量总是在比较的右边 因此,现在我没有使用typeofxmlhttprequest==“undefined”而是使用“undefined”==typeofxmlhttprequest和if(null!==a)来代替if(a!==null),就像一些例子一样 我知道他们完成了同样的事情,但这不是我习惯的风格。换掉这些东西有什么好处吗?我看不出会有什么 有人能解释一下为什么闭包编译器决定这么做吗?这仅仅是谁写的结束语的一部分的
typeofxmlhttprequest==“undefined”
而是使用“undefined”==typeofxmlhttprequest
和if(null!==a)
来代替if(a!==null)
,就像一些例子一样
我知道他们完成了同样的事情,但这不是我习惯的风格。换掉这些东西有什么好处吗?我看不出会有什么
有人能解释一下为什么闭包编译器决定这么做吗?这仅仅是谁写的结束语的一部分的偏好吗
编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践。那很好,但这是在编译之后。是否有性能优势,或者闭包编译器只是试图证明一点?是的,您不能指定常量,
=
很容易输入错误(有时您可能会忘记一个,并使用=
)
例如,两者之间的区别是什么
if (a == 1) { }
……还有
if (a = 1) { }
??无论a
的值是多少,第二个值总是计算为true
如果你翻转左舵和右舵,你可以看到直接的好处
if (1 == a) { }
…将按预期工作,并且
if (1 = a) { }
…会失败,因为你不能给常量赋值。
< P>通常用C/C++语言来完成,所以你不能意外地做< /P>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
}
我知道的原因是为了防止
if (x = 5) { }
如果你把它倒过来
if (5 = x) { }
您将得到一个编译器错误
但是如果你把它写成
if (5 == x) { }
它会编译好的。我的大脑会解析
if( x < y )
可能是因为真正的轴总是从左到右的,因此使条件更容易可视化
然而,在java中,编写代码更为实用
if( "string".equals(x) ) {...
而不是“更自然”
消除任何NPE机会 只是对常见错误的特定情况的静态分析的廉价替代品编译器切换顺序的原因非常简单:使用gzip压缩效果更好。编译器根本不关心如何提高理解力或使其更易于编辑。通过切换常见比较的顺序,例如“if(x==null)…if(y==null)…变成”if(null==x)…if(null==y)…Gzip找到“if(null==”并且可以用一个令牌代替它。这不是一个很大的改进,但它包含了一个很大的代码库。在SOAh上以不同的形式多次询问,good ol'…事实上,这与更一般的yoda条件问题不同,请在回答/评论/投票之前仔细阅读该问题。Java中也使用它来预处理问题在这样的情况下抛出NullPointerException:
“foo”.equals(someString);
值得一提的是,任何合适的编译器(或脚本语言中的lint风格工具)在使用if(a=null)
时都会显示警告,除非您使用if((a=null))明确说明您的意图
嗨,John,我想知道你是否可以回答我对alex的回答所做的后续评论。谢谢你的回答,但我想知道Closure为什么会这样做。Closure将代码编译成这种格式,如果我的原始代码中有(a=1)这样的错误,我相信Closure可能会把它留在那里,因为(a=1)仍然是有效代码。为什么编译后的代码以这种方式对操作数进行排序很重要?我认为一个理智的程序员在可以参考源代码的情况下不会再对编译后的代码进行处理。
对闭包知之甚少,无法给出可靠的答案,但是:if(1=a)
不是有效的JS,因此编译后的代码将无法运行。与使用if(a=1)相比,您更有可能发现错误
它确实在运行,但不会产生正确的结果。@John3136谢谢,我很感谢你给我回电话。看起来最合理的解释是gzip假设在操作数切换时压缩得更好。说“可能”没有任何好处。做一些基准测试并找出答案。@alex在人脑上做基准测试?我想这就是泰吉里所指的。同样,我的大脑理解“x==1”的速度比理解“1==x”的速度快。程序员的头脑才是真正重要的——因为编译器是可以修复的。@Nathan是的,我没有像我想的那样彻底地阅读答案。谢谢你的答案,但我想知道为什么闭包会这样做。闭包会将代码编译成这种格式,如果有(a=1)这样的错误在我的原始代码中,我确信闭包可能会把它留在那里,因为(a=1)仍然是有效的代码。为什么编译后的代码以这种方式对操作数进行排序很重要?我不认为一个理智的程序员在可以引用源代码的情况下会希望再次处理编译后的代码。因此,本质上你是说编译器首先部分删除代码,即使这对最终结果没有任何作用?不是吗我想这是有道理的,lint实用程序可能是在编译器之前完成的。我想是的,因为在一般情况下,低级别的值出现在处理器上(或者可能是某种解释程序的替代品)登记和比较OPCODES的例子,你不能在C++中犯这样的错误,但是你可以在C++或CIT中有意义。我后来读到了“代码>空0”/CODE,在高级优化器模式下,完全取代了大小/压缩的目的,将代码标记为这个。操作数切换后压缩效果更好那会更好!@John你能提供一个链接或更多细节吗?听起来很奇怪,但我想了解更多!问题是:。类似的增强功能在谷歌的代码库(几乎所有主要产品,如地图和gmail)上都经过测试。@John3136我知道的不多
if( "string".equals(x) ) {...
if( x.equals("string") ) {...