This had me confused for the longest time. I thought it was just a cultural difference, and that everyone complaining about semicolon insertion being the worst feature in the language was an idiot. The oft-repeated example from NullUserException's answer didn't sway me because, disregarding indentation, Python behaves the same as JavaScript in that case.

Then one day, I wrote something vaguely like this:

alert(2) (x = $("#foo")).detach()

I expected it to be interpreted like this:

alert(2); (x = $("#foo")).detach();

It was actually interpreted like this:

alert(2)(x = $("#foo")).detach();

I now use semicolons.

JavaScript will only1 treat a newline as a semicolon in these cases:

It's a syntax error not to.

The newline is between the throw or return keyword and an expression.

or keyword and an expression. The newline is between the continue or break keyword and an identifier.

or keyword and an identifier. The newline is between a variable and a postfix ++ or -- operator.

This leaves cases like this where the behaviour is not what you'd expect. Some people2 have adopted conventions that only use semicolons where necessary. I prefer to follow the standard convention of always using them, now that I know it's not pointless.

1 I've omitted a few minor details, consult ECMA-262 5e Section 7.9 for the exact description.

2 Twitter Bootstrap is one high-profile example.