Javascript (ECMAscript) поддерживает метод Array.prototype.forEach
начиная с версии 1.6 (ECMAscript edition 3, 2005). Так что многие браузеры уже поддерживают этот метод, и он невероятно быстр по сравнению, например, с методом jQuery $.each()
.
(На самом деле он превосходит все реализации, независимо от того, какая библиотека Javascript)
По сравнению с jQuery это примерно на 60-70% быстрее. Попробуйте сами на forEach против jQuery на JSPerf.
Единственный недостаток, который я до сих пор использовал, это то, что я не могу придумать способ прервать итерацию раньше. Как for
, while
и do-while
имеют оператор break
, jQuerys .each()
поддерживает return false
для прерывания цикла.
Я изучил спецификации ECMAScript Edition 5 (последнее, что я нашел), но в них не упоминается ранний разрыв из этого цикла.
Итак, вопрос, будет ли мистер Дуглас Крокфорд называть это design error
?
Я что-то упустил, и возможно ли разорвать такой цикл раньше?
Редактировать
Спасибо за ответы. Я полагаю, поскольку никто не придумал «нативное» решение, для этого действительно нет реализации (возможно, особенность?) Во всяком случае, мне не очень нравятся предложенные методы, поэтому я немного обманулся и наконец нашел тот, который мне нравится (по крайней мере, лучше). Похоже:
var div = document.createElement('div'),
divStyle = div.style,
support = jQuery.support,
arr = ['MozTransform', 'WebkitTransform', 'OTransform'];
arr.slice(0).forEach(function(v,i,a){
if(divStyle[v] === ''){
support.transform = v;
a.length = 0;
}
});
Это "настоящий" производственный код. Я искал хороший способ поиска свойств преобразования css3, и я заблудился в спецификациях ecma5 и странных форумах Javascript: -)
Таким образом, вы можете передать сам объект массива в качестве третьего параметра в обратный вызов .forEach
. Я создаю копию из исходного массива с вызовом slice(0)
и устанавливаю для его свойства .length
значение 0, как только я нашел то, что искал. Работает довольно хорошо.
Если кто-то найдет лучшее решение, я, конечно, отредактирую его.