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...
typeof ({}+[])this one, it's string.{}+[]would beobject, because both of them are.){}+[] === ""is evaluated as{}; +[] === "";, i.e. empty block and+[] === "".{}+[] === 0yieldstrue.{}in{}+[] === ""the parser does not know whether{}should indicate an object literal or a block. Since this is not in an expression context,{}is interpreted as block (the default behavior). The parenthesis(...)force an evaluation as expression.{}+[]is interpreted as two statements and not as one. But since JavaScript has automatic semicolon insertion it might actually do this. Why? Because if some syntax is ambiguous, a decision has to be made how to interpret it. In this case, the developers decided to interpret{}+[]asblock,unary plus,arrayand not asobject,addition operator,array. You might not agree with this, but that's how it is :)