> [] + []
"" (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.