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 {}+[]
??
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 typeof
returns "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
{}+[] === "" //false
see #3, {}
is interpreted as a block, you are getting 0
on the left.
Compare {}+[] === 0 // true
.
({}+[]) === "" //false
see #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
.
({};+[]) === "" //SyntaxError
I guess, this one is self-explanatory :)
({}+[]).length //15
15 is exactly the length of "[object Object]"
, see above.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With