Ответ 1
push быстрее, почти на 300% быстрее.
Доказательство: http://jsperf.com/push-vs-length-test
Каковы недостатки:
var myArray = [];
myArray[myArray.length] = val1;
myArray[myArray.length] = val2;
вместо:
var myArray = [];
myArray.push(val1);
myArray.push(val2);
Я уверен, что метод push гораздо более "приемлем", но существуют ли какие-либо различия в функциональности?
push быстрее, почти на 300% быстрее.
Доказательство: http://jsperf.com/push-vs-length-test
Так как массивы в JavaScript не имеют дыр, функциональность этих двух методов одинакова. И да, использование .push()
намного чище (и короче).
Я обычно думал, что назначение длины происходит быстрее. Просто нашел Индекс против производительности push, который поддерживает это; для моего браузера Chrome 14, в любом случае, за один тестовый прогон. Однако в Chrome не так много.
Кажется, что существует несоответствие, на котором тест быстрее среди разных JavaScript-движков. Различия в скорости могут быть незначительными (если не требуется нечестивое количество толкателей). В этом случае разумный разработчик должен всегда ошибаться со стороны читаемости. В этом случае, на мой взгляд, и мнение @TheifMaster заключается в том, что [].push()
чище и его легче читать. Обслуживание кода является самой дорогой частью кодирования.
Как я тестировал, первый способ быстрее, я не уверен, почему, продолжайте исследовать. Также 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);
В 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)
};
чтобы он отлично возвращал ссылку на массив, к которому он обращался.