Podczas kopania w kodzie źródłowym biblioteki podkreślenia, znalazłem w tym _.each
opiera się na ECMAScript 5 API Array.forEach
ilekroć dostępnych:Czy istnieje powód, dla którego jQuery.each nie bazuje na Array.forEach, jeśli jest dostępny?
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) {
return;
}
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) {
return;
}
}
}
}
};
zauważyłem, że jQuery.each (statyczny jeden, nie sposób .each jQuery wrapper) działa tylko tradycyjnie for
, który wywołuje funkcję zwrotną, niezależnie od tego, czy jest dostępna wersja forEach
. Czy jest jakiś powód, dla którego tęskniłem?
jQuery to obiekt, a nie tablica. Konieczna byłaby konwersja między tablicą a obiektem typu nodeList, aby móc łączyć wywołanie jQuery z użyciem metody Array. – kennebec
@kennebec Mówię o $ .each(), nie .each(). Zmieniłem to pytanie, aby było bardziej zrozumiałe. –
Jednym z możliwych wyjaśnień jest to, że '.each()' jQuery nie ma dokładnie tego samego interfejsu co '.forEach', więc nie można ich używać zamiennie. Jeśli jQuery ma swoją implementację jako pierwszą, musieliby złamać/zmienić swój interfejs API, aby użyć .forEach, gdy jest obecny. – jfriend00