1. Abwärtskompatibilität
JavaScript ist eine Implementierung von ECMAScript . Die meisten dieser Funktionen wurden in ECMAScript 5 (ES5) eingeführt, jedoch unterstützen viele ältere Browser, die immer noch einen ausreichenden Marktanteil haben, diese Funktionen nicht (siehe ECMAScript 5-Kompatibilitätstabelle ). Die bekanntesten sind IE8.
Im Allgemeinen werden Bibliotheken auf die native Implementierung zurückgreifen, wenn sie ansonsten vorhanden sind. Verwenden Sie eine eigene Polyfüllung. Schauen wir uns beispielsweise die AngularJS-Implementierung an ( angular.js L203-257 ):
function forEach(obj, iterator, context) {
var key;
if (obj) {
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
}
return obj;
}
In den folgenden Zeilen wird überprüft, ob die forEach
Methode für das Objekt vorhanden ist und ob es sich um die AngularJS-Version handelt. Wenn nicht, wird die bereits angegebene Funktion (die native Version) verwendet:
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
}
2. Bequemlichkeit
In nativem JavaScript Array.prototype.forEach
ist eine Methode exklusiv für eine Instanz von Array
, die meisten Object
sind jedoch auch iterabel.
Aus diesem Grund machen viele Bibliotheksersteller ihre Funktionen polymorph (sie können mehrere Typen als Eingabe akzeptieren). Nehmen wir den obigen AngularJS-Code und sehen, welche Eingaben akzeptiert werden:
Funktionen :
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
Arrays (mit nativem forEach-Support):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
Array-ähnliche Objekte, einschließlich Array (ohne native forEach-Unterstützung), String, HTMLElement, Object mit einer gültigen length-Eigenschaft:
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
Objekte:
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
Fazit
Wie Sie sehen, durchläuft AngularJS die meisten JavaScript-Objekte, obwohl es genauso funktioniert wie die native Funktion. Es akzeptiert weitaus mehr verschiedene Eingabetypen und ist somit eine gültige Ergänzung der Bibliothek sowie eine Möglichkeit, ES5-Funktionen zu implementieren zu älteren Browsern.