piersadrian
piersadrian

Reputation: 1703

Does operand order make any difference when evaluating equality or identity in JavaScript?

Question: does operand order make any difference when evaluating equality or identity in JavaScript?

In code, is (0 == value) faster or more correct than (value == 0)? (Note that this question is equally valid for the identity operator, ===.)

Since both the equality and identity operators are commutative, I don't believe the operand order should make a difference in evaluation performance, unless there's some inherent benefit to the left-side literal in the computation of the equality algorithm itself. The only reason I wonder is that I recently used Google's Closure Compiler to boil down some JavaScript, and noticed that

if (array.length == 0 && typeof length === 'number') {

had been compiled to

if(0 == b.length && "number" === typeof c) {.

In both equality expressions—one loose and one strict—Closure has reversed the order of my operands, placing a Number literal and a String literal on the left–hand sides of their respective expressions.

This made me curious.

I read through the Equality Operators section of the ECMAScript 5.1 Language Specification (section 11.9, pp. 80–82) and found that while the equality algorithms start by examining the left–hand operands first, there's no indication that it's faster or better to use a literal as that operand.

Is there something about ECMAScript's type–checking that makes examination of literals optimal? Could it be some optimization quirk in the Closure compiler? Or perhaps an implementation detail in an older version of ECMAScript's equality algorithm which has been nullified in this newer version of the spec?

Upvotes: 5

Views: 221

Answers (2)

epascarello
epascarello

Reputation: 207557

A lot of time people code with the variable on the right as a style convention. Main reason it can catch errors with sloppy coding.

The following code is most likely a bug, but the if statement will evaluate to true.

if( n = 1 ) { }

and this will throw an error

if( 1 = n ) { }

Upvotes: 2

Blender
Blender

Reputation: 298532

http://jsperf.com/lr-equality

I can't really give you an explanation, but you can check the numbers. They seem to be equal (now).

Upvotes: 1

Related Questions