Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with adding object with array

Tags:

javascript

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:

enter image description here

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...

like image 1000
Derek 朕會功夫 Avatar asked Apr 29 '12 22:04

Derek 朕會功夫


1 Answers

Type of {}+[] may vary depending on the context.

  1. 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).

  2. var crazy = {}+[]; typeof crazy //"string"
    In this case you are adding object and array - they both coerce to string, therefore typeof returns "string".

  3. {}+[]
    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.

like image 65
Li0liQ Avatar answered Oct 21 '22 15:10

Li0liQ