What’s the difference between “Array()” and “[]” while declaring a JavaScript array?

后端 未结 18 1512
生来不讨喜
生来不讨喜 2020-11-21 12:00

What\'s the real difference between declaring an array like this:

var myArray = new Array();

and

var myArray = [];
<         


        
18条回答
  •  臣服心动
    2020-11-21 12:57

    There is an important difference that no answer has mentioned yet.

    From this:

    new Array(2).length           // 2
    new Array(2)[0] === undefined // true
    new Array(2)[1] === undefined // true
    

    You might think the new Array(2) is equivalent to [undefined, undefined], but it's NOT!

    Let's try with map():

    [undefined, undefined].map(e => 1)  // [1, 1]
    new Array(2).map(e => 1)            // "(2) [undefined × 2]" in Chrome
    

    See? The semantics are totally different! So why is that?

    According to ES6 Spec 22.1.1.2, the job of Array(len) is just creating a new array whose property length is set to the argument len and that's it, meaning there isn't any real element inside this newly created array.

    Function map(), according to spec 22.1.3.15 would firstly check HasProperty then call the callback, but it turns out that:

    new Array(2).hasOwnProperty(0) // false
    [undefined, undefined].hasOwnProperty(0) // true
    

    And that's why you can not expect any iterating functions working as usual on arrays created from new Array(len).

    BTW, Safari and Firefox have a much better "printing" to this situation:

    // Safari
    new Array(2)             // [](2)
    new Array(2).map(e => 1) // [](2) 
    [undefined, undefined]   // [undefined, undefined] (2) 
    
    // Firefox
    new Array(2)             // Array [ <2 empty slots> ]
    new Array(2).map(e => 1) // Array [ <2 empty slots> ]
    [undefined, undefined]   // Array [ undefined, undefined ]
    

    I have already submitted an issue to Chromium and ask them to fix this confusing printing: https://bugs.chromium.org/p/chromium/issues/detail?id=732021

    UPDATE: It's already fixed. Chrome now printed as:

    new Array(2)             // (2) [empty × 2]
    

提交回复
热议问题