Problems with adding object with array
javascript
Solution
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.
Problem
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...