Мне понравился этот вопрос - Легитимное использование конструктора Function - так что я хотел создать аналогичный вопрос относительно конструктора Array.
Конечно, литеральная запись массива - это правильный способ создания массивов. Это означало бы, что обозначение new Array не должно использоваться. И "случай закрыт".
Однако существует одна специфичность формы new Array. Если передано натуральное число, создается пустой массив и его свойство length установлено на это число.
Итак,
arr = new Array( 7 );
эквивалентно
arr = [];
arr.length = 7;
Это можно рассматривать как функцию. Мне было интересно, имеет ли эта "функция" реальное использование. Я недавно наткнулся на одно такое (простое) использование:
new Array( n + 1 ).join( '*' ) // returns string containing n stars
// e.g.
new Array( 3 ).join( '*' ) // returns '**'
new Array( 6 ).join( '*' ) // returns '*****'
Это круто, но надеялся на некоторые более продвинутые цели. (Что-то, что сделало бы обозначение new Array законным инструментом в программах JavaScript.)
Обновление: Я заметил, что библиотека jQuery использует нотацию new Array( len ) в одном экземпляре - внутри функции when (поиск "when:"):
when: function( firstParam ) {
var args = sliceDeferred.call( arguments, 0 ),
i = 0,
length = args.length,
pValues = new Array( length ),
count = length,
pCount = length,
// etc.
Они используют его для инициализации локальной переменной pValues, которая используется в локальной функции далее в коде:
function progressFunc( i ) {
return function( value ) {
pValues[ i ] = arguments.length > 1 ?
sliceDeferred.call( arguments, 0 ) : value;
deferred.notifyWith( promise, pValues );
};
}
Я хотел бы знать, если изменить назначение только на
pValues = [],
будет разорвать программу... (Требуется ли new Array( length ) для notifyWith работать правильно?)