Мне понравился этот вопрос - Легитимное использование конструктора 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
работать правильно?)