A quick Javascript formatting tip
Written by Piers Cawley on , updated
IE’s a pain. The particular pain I want to write about is its pickiness about Javascript object literals. Consider the following Javascript object:
{ success: function () {...},
failure: function () {...},
}
If you're used to programming in Perl or Ruby, that trailing comma's perfectly fine, in fact leaving it there is sometimes considered good practice because it makes it easy to extend the hash, just add a new row and leave another trailing comma.The trouble is, it’s not strictly legal to do that in Javascript. Pretty much every implementation out there will allow it though.
IE’s a pain. The particular pain I want to write about is its pickiness about Javascript object literals. Consider the following Javascript object:
{ success: function () {...},
failure: function () {...},
}
If you're used to programming in Perl or Ruby, that trailing comma's perfectly fine, in fact leaving it there is sometimes considered good practice because it makes it easy to extend the hash, just add a new row and leave another trailing comma.The trouble is, it’s not strictly legal to do that in Javascript. Pretty much every implementation out there will allow it though.
Except IE.
So, I’ve taken a leaf out of Damian Conways Perl Best Practices and writing my object literals as:
{ success: function () {...}
, failure: function () {...}
}
By sticking the comma at the beginning of the line, I'm never going to make an object that breaks IE, and adding a new line to the hash is straightforward too. Just stick the cursor in front of the }
, type my leading comma, space, attribute name, and hit return when I'm finished.I’ve also started using the same practice pretty much everywhere else that I’ve got a comma separated list of things:
var foo
, bar
, baz
;
$.each( anArray
, function () { ... }
);
It looks weird at first, but trust me, it grows on you.Update
In the comments, I make reference to tweaking Steve Yegge’s excellent js2-mode to handle leading comma style a little more gracefully. Since then, I’ve made it work and attached a diff to this issue on the project’s issue tracker.