EcmaScript 6
Wenn Sie ES6 verwenden, können Sie ein Array der Elemente erstellen und Folgendes verwenden includes
:
['a', 'b', 'c'].includes('b')
Dies hat einige inhärente Vorteile gegenüber, indexOf
da es das Vorhandensein NaN
in der Liste ordnungsgemäß testen und fehlende Array-Elemente wie das mittlere in [1, , 2]
mit übereinstimmen kann undefined
. includes
funktioniert auch mit JavaScript-typisierten Arrays wie Uint8Array
.
Wenn Sie Bedenken hinsichtlich der Browserunterstützung haben (z. B. für IE oder Edge), können Sie dies bei CanIUse.Com überprüfen.Array.includes
Wenn Sie auf eine fehlende Browser- oder Browserversion abzielen möchten includes
, empfehle ich polyfill.io für das Polyfilling.
Ohne Array
Sie können isInList
Zeichenfolgen wie folgt eine neue Eigenschaft hinzufügen :
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
Dann benutze es so:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
Sie können das Gleiche für tun Number.prototype
.
Array.indexOf
Wenn Sie einen modernen Browser verwenden, indexOf
funktioniert dies immer. Für IE8 und frühere Versionen benötigen Sie jedoch eine Polyfüllung.
Wenn indexOf
-1 zurückgegeben wird, befindet sich das Element nicht in der Liste. Beachten Sie jedoch, dass diese Methode nicht ordnungsgemäß überprüft NaN
wird und zwar mit einem expliziten undefined
Element übereinstimmen kann, jedoch nicht mit einem fehlenden Element undefined
wie im Array [1, , 2]
.
Polyfill für indexOf
oder includes
im IE oder einem anderen Browser / einer anderen Version ohne Unterstützung
Wenn Sie einen Dienst wie polyfill.io nicht wie oben erwähnt verwenden möchten , können Sie jederzeit benutzerdefinierte Polyfills in Ihren eigenen Quellcode aufnehmen, die den Standards entsprechen. Zum Beispiel hat Mozilla Developer Network eine für indexOf
.
In dieser Situation, in der ich eine Lösung für Internet Explorer 7 erstellen musste, habe ich meine eigene einfachere Version der indexOf()
Funktion "gerollt" , die nicht den Standards entspricht:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Ich denke jedoch nicht, dass Änderungen Array.prototype
auf lange Sicht die beste Antwort sind. Änderungen Object
und Array
Prototypen in JavaScript können zu schwerwiegenden Fehlern führen. Sie müssen entscheiden, ob dies in Ihrer eigenen Umgebung sicher ist. Wichtig ist, dass beim Iterieren eines Arrays (wenn Array.prototype Eigenschaften hinzugefügt hat) mit for ... in
der neue Funktionsname als einer der Schlüssel zurückgegeben wird:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
Ihr Code funktioniert jetzt möglicherweise, aber in dem Moment, in dem jemand in Zukunft eine JavaScript-Bibliothek oder ein Plugin eines Drittanbieters hinzufügt, das nicht eifrig vor geerbten Schlüsseln schützt, kann alles kaputt gehen.
Die alte Methode, um diesen Bruch zu vermeiden, besteht darin, während der Aufzählung jeden Wert zu überprüfen, um festzustellen, ob das Objekt ihn tatsächlich als nicht vererbte Eigenschaft hat, if (arr.hasOwnProperty(x))
und erst dann damit zu arbeiten x
.
Der neue ES6-Weg, um dieses Problem mit zusätzlichen Schlüsseln zu vermeiden, besteht darin, of
anstelle von in
, for (let x of arr)
. Wenn Sie jedoch nicht garantieren können, dass alle Ihre Code- und Drittanbieter-Bibliotheken sich strikt an diese Methode halten, möchten Sie sie für die Zwecke dieser Frage wahrscheinlich nur includes
wie oben angegeben verwenden.