Inspired by this video, I tested further with {}+[].
Test 1:
typeof {}+[] //"object"
Okay, so {}+[] is an object.
Test 2:
var crazy = {}+[];
typeof crazy //"string"
What? Didn’t {}+[] is an object? Why is it a string now?
Test 3:
console.log({}+[])
What I got:

So it is a number!… No?
So what actually is the type of {}+[]??
UPDATED
To people who say {}+[] is a empty string:
{}+[] === "" //false
({}+[]) === "" //false
({};+[]) === "" //SyntaxError
({}+[]).length //15
JavaScript is so hard to understand…
Type of
{}+[]may vary depending on the context.typeof {}+[] //"object"As per operators precedence in this case
typeof {}evaluates to “object”,+[]adds an empty string(array is coerced to string) therefore result is “object”.You could think of checking
typeof ({}+[])(your second case).var crazy = {}+[];typeof crazy //"string"
In this case you are adding object and array – they both coerce to string, therefore
typeofreturns “string”.{}+[]This is interpreted as an empty block of code, unary plus and empty array.
First part does nothing, array is converted to a comma-separated string of it’s elements(empty string for empty array), then to a number(empty string is converted to 0), hence
0.UPDATED
{}+[] === "" //falsesee #3,
{}is interpreted as a block, you are getting0on the left.Compare
{}+[] === 0 // true.({}+[]) === "" //falsesee #1,
{}is interpreted as an object literal. When trying to add array and object, they both convert to string,"[object Object]"for object and empty string for array. Hence, you are getting"[object Object]"on the left.Compare
({}+[]) === "[object Object]" // true.({};+[]) === "" //SyntaxErrorI guess, this one is self-explanatory 🙂
({}+[]).length //1515 is exactly the length of
"[object Object]", see above.