Законное использование конструктора 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 = [],

нарушению программы ...(Требуется ли новый массив (длина) для notifyWith для правильной работы?)

13
задан Community 23 May 2017 в 12:11
поделиться