| For those wondering how you get numbers, strings and other primitives from a whole bunch of empty arrays and objects in JavaScript, here's what happens when you do arithmetic and other operations on arrays and objects: > [] + [] "" (An empty string) > {} + [] 0 (The number zero) > [] + {} "[object Object]" (.toString() called on a plain object). > ![] false (!{} is the same) > !![] true (not false) > +[] 0 (the number zero) > -[] -0 (negative zero) > +{} NaN (Not a number, same goes for -{}) > "" + [] "" (empty string) > "" - [] 0 (number zero, not empty string) And the one that gets more people than the previous list: > typeof [] === typeof {} true Incidentally, some of these things can be useful. For example, +(x) will always evaluate to a double (unless it is preceded by a string), while (x|0) will always evaluate to a 32bit integer. asm.js abuses (to an extent) this to have more control over types, and most JavaScript engines would now store the result of (x|0) as an integer internally instead of a double. |
Should you be using any of this in production code? No
The next programmer even if he is a really good one might not know that particular esoteric trick.
I'm not trying to vote down or anything, but what is the point? Most of it look like language design warts to me. Most of them should have thrown exceptions and errored out.
Now I'm loving the idea of static typing a lot more.