Подтвердить что ты не робот

Какая разница между Array (1) и новым массивом (1) в JavaScript?

Я только начал задумываться об этом, но не мог получить никаких различий, чтобы разоблачить себя, в то время как обманывая jsFiddle.

var a = new Array(1),
    b = Array(1);

console.log(a, b);

Вывод - это два массива с одним членом undefined.

Выполнение for ( in ) показывает, что у них одинаковые свойства.

В чем разница между ними? Является ли первый простой экземпляр объекта явно?

Пожалуйста, не читайте мне лекции о использовании символьной литералы массива, как я уже знал об этом. Я больше желаю заполнить этот пробел в моих знаниях, объясненных выше.

4b9b3361

Ответ 1

С Array оба эквивалентны. new вводится, когда он вызывается как функция:

15.4.1 Конструктор Array, вызываемый как функция

Когда Array вызывается как функция, а не как конструктор, он создает и инициализирует новый объект Array. Таким образом, вызов функции Array(…) эквивалентен выражению создания объекта new Array(…) с теми же аргументами.

Из ECMA-262, 3-е издание (с аналогичным в 5th Edition).

Ответ 2

Согласно Javascript: The Definitive Guide (5th Edition), стр. 602: "Когда конструктор Array() вызывается как функция, без оператора new он ведет себя точно так же, как и при вызове с new.

Ответ 3

Разница заключается в реализации функции массива. Является ли вызов массива без нового оператора возвратом экземпляра массива или нет, зависит от реализации. Например, движок Mozilla SpiderMonkey делает это:

static JSBool
Array(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
     jsuint length;
     jsval *vector;

     /* If called without new, replace obj with a new Array object. */

Это фактический комментарий от фактического источника. Следующие строки кода здесь не воспроизводятся. Я бы предположил, что другие двигатели делают то же самое. В противном случае поведение undefined. Хорошее чтение на эту тему - сообщение Джона Ресига здесь.