Является ли запись [].forEach.call(...) эквивалентной Array.prototype.forEach.call(...) и используется в основном для перебора коллекции элементов (псевдомассива), тогда как [...].forEach(...) работает непосредственно с элементами массива? И насколько существенна разница в производительности метода forEach и стандартного цикла for(...) или на это не стоит обращать внимания, если количество элементов в массиве не превышает даже сотни?
В варианте [].forEach.call(...) происходит создание нового массива, в отличие от обращения к Array.prototype.
На небольших коллекциях разницу вы не заметите.
Сергей, ну это же ответ на ваш вопрос. Хотя результаты странные, пусть и повторяемые.
вот свой сделал. на ваших массивах из 100 элементах jsfiddle.net/bs4q2uyz/4
Честно говоря я в растерянности, потому что пару месяцев назад результат был противоположным, старый добрый for всех рвал и большим отрывом.
А это говорит нам о том, что такая оптимизация в мелочах бесполезна, ибо будет похоронена особенностями движков, даже разных версий.
"работает непосредственно с элементами массива" - это лишь видимость, на практике это набор инструкций, работающий с адресами в памяти, вычисление адресов будет примерно одинаковым.
А что касается Array.prototype.forEach.call, выше ответили, если [] то в памяти создается пустой объект, из прототипа которого берется функция forEach. Потом этот объект будет удален сборщиком мусора.
в случае Array.prototype.forEach.call мы вызываем сразу саму функцию опосредованно через call. Разница исчезающе мала.
Не совсем так. Если этих объектов действительно много, то разница будет заметна.
Вот к примеру взять вот эту демку, и изменить так, чтобы на каждом кадре генерировались сотни пустых объектов. Разница будет заметна не только в профайлере.