Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Google Closure swap arguments?

I've seen the Google Closure compiler do a lot of rewriting in if-clauses. For example:

if (a === 3) {…}

turns to

if (3 === a) {…}

Are comparisons faster in JavaScript, if the primitive is the first argument, or what is the reason for this?

like image 508
mritz_p Avatar asked Dec 04 '12 10:12

mritz_p


1 Answers

From ReorderConstantExpression.java:

/**
 * Reorder constant expression hoping for a better compression.
 * ex. x === 0 -> 0 === x
 * After reordering, expressions like 0 === x and 0 === y may have higher
 * compression together than their original counterparts.
 *
 */

As stated by a google closure compiler contributor, the compression the code comments are referring to means gzip compression, not the actual minification "compression". The reason it can improve gzip compression is that if you have 0 === x and x === 0 in your code, the closure compiler normalizes both of these to 0 === x, which is duplicated text and thus compresses better.

Then there is also:

typeof this.value == "object"

typeof this.key == "object"

The unique strings are: typeof this., value, key and == "object"

But if you reorder:

"object" == typeof this.value

"object" == typeof this.key

The unique strings are: "object" == typeof this., value and key. Less unique strings and quite a long duplicate one.

like image 136
Esailija Avatar answered Oct 22 '22 03:10

Esailija