Есть ли причина, по которой разработчики 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 (:

Ответ 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 императив.