在评估JavaScript中的相等或身份时,操作数顺序是否有任何区别?

时间:2012-01-21 00:25:14

标签: javascript syntax equality

问题:在评估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的相等算法中的实现细节,该算法在较新版本的规范中已经无效?

2 个答案:

答案 0 :(得分:2)

很多时候人们将右边的变量编码为样式约定。它可以通过草率编码来捕捉错误的主要原因。

以下代码很可能是一个错误,但if语句将评估为true。

if( n = 1 ) { }

这会抛出错误

if( 1 = n ) { }

答案 1 :(得分:1)

http://jsperf.com/lr-equality

我无法真正给你解释,但你可以查看数字。他们似乎是平等的(现在)。