问题:在评估JavaScript中的相等或身份时,操作数顺序是否会有所不同?
在代码中,(0 == value)
比(value == 0)
更快还是更正确? (请注意,此问题对于身份运算符===
同样有效。)
由于相等和同一性运算符都是可交换的,我不相信操作数顺序应该对评估性能产生影响,除非在计算等式算法本身时对左侧文字有一些固有的好处。我想知道的唯一原因是我最近使用谷歌的Closure Compiler来制作一些JavaScript,并注意到了
if (array.length == 0 && typeof length === 'number') {
已编译为
if(0 == b.length && "number" === typeof c) {
。
在两个相等的表达式中 - 一个松散和一个严格的闭包已经颠倒了我的操作数的顺序,在它们各自表达式的左侧放置了一个数字文字和一个字符串文字。
这让我很好奇。
我通读了ECMAScript 5.1 Language Specification的 Equality Operators 部分(第11.9节,第80-82页),发现虽然等式算法首先检查左侧操作数,没有迹象表明使用文字作为操作数会更快或更好。
ECMAScript的类型检查有什么能够使文字检查达到最佳状态吗?它可能是Closure编译器中的一些优化怪癖吗?或者可能是旧版ECMAScript的相等算法中的实现细节,该算法在较新版本的规范中已经无效?
答案 0 :(得分:2)
很多时候人们将右边的变量编码为样式约定。它可以通过草率编码来捕捉错误的主要原因。
以下代码很可能是一个错误,但if语句将评估为true。
if( n = 1 ) { }
这会抛出错误
if( 1 = n ) { }
答案 1 :(得分:1)
我无法真正给你解释,但你可以查看数字。他们似乎是平等的(现在)。