Какая разница между Array (1) и новым массивом (1) в JavaScript?
Я только начал задумываться об этом, но не мог получить никаких различий, чтобы разоблачить себя, в то время как обманывая jsFiddle.
var a = new Array(1),
b = Array(1);
console.log(a, b);
Вывод - это два массива с одним членом undefined.
Выполнение for ( in )
показывает, что у них одинаковые свойства.
В чем разница между ними? Является ли первый простой экземпляр объекта явно?
Пожалуйста, не читайте мне лекции о использовании символьной литералы массива, как я уже знал об этом. Я больше желаю заполнить этот пробел в моих знаниях, объясненных выше.
Ответы
Ответ 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. Хорошее чтение на эту тему - сообщение Джона Ресига здесь.