Использование метода push или .length при добавлении в массив?

Каковы недостатки:

var myArray = [];
myArray[myArray.length] = val1;
myArray[myArray.length] = val2;

вместо:

var myArray = [];
myArray.push(val1);
myArray.push(val2);

Я уверен, что метод push гораздо более "приемлем", но существуют ли какие-либо различия в функциональности?

Ответы

Ответ 2

Так как массивы в JavaScript не имеют дыр, функциональность этих двух методов одинакова. И да, использование .push() намного чище (и короче).

Ответ 3

Я обычно думал, что назначение длины происходит быстрее. Просто нашел Индекс против производительности push, который поддерживает это; для моего браузера Chrome 14, в любом случае, за один тестовый прогон. Однако в Chrome не так много.

Ответ 4

Кажется, что существует несоответствие, на котором тест быстрее среди разных JavaScript-движков. Различия в скорости могут быть незначительными (если не требуется нечестивое количество толкателей). В этом случае разумный разработчик должен всегда ошибаться со стороны читаемости. В этом случае, на мой взгляд, и мнение @TheifMaster заключается в том, что [].push() чище и его легче читать. Обслуживание кода является самой дорогой частью кодирования.

Ответ 5

Как я тестировал, первый способ быстрее, я не уверен, почему, продолжайте исследовать. Также ECMA не упоминает, какой из них лучше, я думаю, что это зависит от того, как поставщик браузера реализует это.

var b = new Array();
var bd1 = new Date().getTime();
for(var i =0;i<1000000; i++){
    b[b.length] = i;
};

alert(new Date().getTime()- bd1);

var a = new Array();
var ad1 = new Date().getTime();
for(var i =0;i<1000000; i++){
    a.push(i);
};

alert(new Date().getTime()- ad1);

Ответ 6

В JS есть 3 разных способа добавления элемента в конец массива. Все трое имеют свои различные варианты использования.

1) a.push(v), a.push(v1, v2, v3), a.push(... [1,2,3,4]), a.push(... "тест" )

Push не очень хорошо продуманная функция в JS. Он возвращает длину результирующего массива. Как глупо. Таким образом, вы никогда не сможете цеплять push() в функциональном программировании, если вы не хотите вернуть длину в самом конце. Он должен был вернуть ссылку на объект, к которому он обращался. Я имею в виду, что тогда будет возможно получить длину, если нужно, например, a.push(..."idiot").length. Забудьте о push, если у вас есть намерения сделать что-то функциональное.

2) a [a.length] = "something"

Это самый большой соперник a.push( "что-то" ). Люди борются за это. Для меня единственное отличие состоит в том, что

  • Это возвращает значение, добавленное в конец массива
  • Принимает только одно значение. Это не так умно, как толчок.

Вы должны использовать его, если возвращаемое значение вам будет полезно.

3. a.concat(v), a.concat(v1, v2, v3), a.concat(... [1,2,3,4]), a.concat([1,2,3,4])

Конкат невероятно удобен. Вы можете использовать его точно так же, как push. Если вы передадите аргументы в массиве, он распространит их до конца массива, на который он вызвал. Если вы передадите их в виде отдельных аргументов, он все равно будет делать то же самое, что и a = a.concat([1,2,3],4,5,6); //returns [1, 2, 3, 4, 5, 6] Однако не делайте этого.. не так надежно. Лучше передать все аргументы в литерале массива.

Лучшая вещь с concat - это возврат ссылки на результирующий массив. Поэтому он идеально подходит для использования в функциональном программировании и цепочке.

Array.prototype.concat() - это мое предпочтение.

4) Новое предложение push()

На самом деле еще одна вещь, которую вы можете сделать, это перезаписать функцию Array.prototype.push(), например:

Array.prototype.push = function(...args) {
                         return args.reduce(function(p,c) {
                                              p[p.length] = c;
                                              return p
                                            }, this)
                       };

чтобы он отлично возвращал ссылку на массив, к которому он обращался.