Есть ли причина, по которой разработчики JavaScript не используют Array.push()?
Я обычно вижу, что разработчики используют в JavaScript выражение, подобное приведенному ниже:
arr = []
arr[arr.length] = "Something"
arr[arr.length] = "Another thing"
Не подходит ли push
?
arr = []
arr.push("Something")
arr.push("Another thing")
Ответы
Ответ 1
Я действительно задал себе тот же вопрос в начале этого года. ОБНОВЛЕНО с новыми тестовыми примерами http://jsperf.com/array-push-vs-unshift-vs-direct-assignment/2
Похоже, что push
намного быстрее в хроме и примерно равно в FF. Кроме того, в IE9 прямая скорость быстрее, но мне было бы интересно посмотреть, как она работает в IE10.
Я бы сказал, что большинство разработчиков предполагают установку длины массива, а затем использование прямого назначения выполняется быстрее, как в большинстве языков программирования. Но JavaScript отличается. Массивы Javascript на самом деле не массивы, это просто карты ключей и значений, как и все другие объекты JavaScript. Таким образом, предварительное распределение по существу падает на глухие уши.
Лично я предпочитаю push
(:
Ответ 2
Все о производительности - но на самом деле это не имеет значения. Я полагаю http://www.scottlogic.co.uk/2010/10/javascript-array-performance/
Ответ 3
Я считаю, что это в основном привычка.
Некоторые разработчики используют его просто потому, что он так привык к этому, и не считал, что push
будет альтернативой.
Некоторые разработчики однажды узнали, что один метод намного быстрее, чем другой, и не рассматривали это в свете недавних улучшений производительности движков Javascript.
Лично я часто использую push
. Большая часть времени читаемости и ремонтопригодности важнее производительности, по крайней мере, когда влияние производительности достаточно мало. Тесты производительности, опубликованные в ответах, показывают, что разница в производительности между различными методами не очень велика.
Ответ 4
Это способ ограничить вложенные браки. Если у вас их достаточно, вы не можете увидеть, сколько есть или сколько вам нужно (когда позже смотрите на код). Я бы использовал var, нужно только подсчитывать вещи один раз.
bar = foo.length;
foo[ bar++ ] = "new item 0";
foo[ bar++ ] = "new item 1";
foo[ bar++ ] = "new item 2";
foo[ bar++ ] = "new item 3";
http://jsfiddle.net/vEUU3/
Ответ 5
Очень часто, когда я нажимаю объект в массив, я хочу, чтобы ссылка на этот объект возвращалась ко мне. Например:
// Returns object
function createAndAdd(arr) {
return arr[arr.length] = { id: 1 };
}
var obj = createAndAdd(arr);
Теперь у меня есть новый объект, и я добавил его в массив. Если бы я использовал push, я бы вернул длину массива. Он будет выглядеть следующим образом:
function createAndAdd(arr) {
var obj = { id: 1 };
arr.push(obj);
return obj;
}
или даже более уродливым, особенно если объект становится большим:
function createAndAdd(arr) {
return arr[arr.push({ id: 1 }) -1];
}
Лично я люблю функции с непосредственными операциями возврата. Это упрощает и упрощает просмотр. Любите вопрос. Спасибо, что спросили об этом.
Ответ 6
Метод Array.prototype.push возвращает обновленную длину массива, в то время как прямая декларация возвращает значение, которое назначается. Это единственное различие, которое я вижу, но обычно я читаю рекомендации по лучшим методам о том, что метод push является лучшим способом присвоить новые значения массиву.
Ответ 7
Я думаю, что это не о производительности, или, по крайней мере, это не так уж и важно... что действительно важно здесь: декларативный способ vs императив.