Мне понравился этот вопрос - Законное использование конструктора функций - поэтому я хотел создать аналогичный вопрос относительно массива
] конструктор.
Конечно, буквенное обозначение массива - это правильный способ создания массивов. Это означало бы, что не следует использовать нотацию 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 = [],
нарушению программы ...(Требуется ли новый массив (длина)
для notifyWith
для правильной работы?)