Gibt es über die verbesserte Lesbarkeit hinaus einen Vorteil includes
gegenüber indexOf
? Sie scheinen mir identisch zu sein.
Was ist der Unterschied zwischen diesen
var x = [1,2,3].indexOf(1) > -1; //true
Und das?
var y = [1,2,3].includes(1); //true
javascript
ecmascript-7
Matt
quelle
quelle
includes
hat viel schlechtere Browser-Unterstützung.includes
nicht Teil von ES6 / ES2015 ist. Es ist ein Vorschlag für die nächste Version von ECMAScript und wird in diesem Jahr hinzugefügt.includes
Antworten:
tl; dr:
NaN
wird anders behandelt:[NaN].indexOf(NaN) > -1
istfalse
[NaN].includes(NaN)
isttrue
Aus dem Vorschlag :
Weitere Informationen:
SameValueZero
AlgorithmusStrict Equality Comparison
Algorithmusquelle
undefined
von behandelt und von.includes()
nicht berücksichtigt.indexOf()
.Wenn Sie sich über die Leistung wundern, ist indexOf im Moment schneller, aber dieser JSperf- Test zeigt tendenziell, dass mehr Zeit vergeht , mehr
includes()
schneller alsindexOf
(ich denke, es wird weiter optimiert).IMHO schreibe ich auch lieber,
if (arr.includes(el)) {}
da es klarer und wartbarer ist alsif (arr.indexOf(el) !== -1) {}
quelle
.indexOf()
und.includes()
Methoden können verwendet werden, um nach einem Element in einem Array zu suchen oder um nach einem Zeichen / Teilstring in einer bestimmten Zeichenfolge zu suchen.Verwendung im Array
( Link zur ECMAScript-Spezifikation)
indexOf
verwendet Strict Equality Comparison, währendincludes
der SameValueZero- Algorithmus verwendet wird. Aus diesem Grund ergeben sich die folgenden zwei Unterschiede.Wie Felix Kling betonte, ist das Verhalten bei
NaN
.undefined
.Verwendung in String
( Link zur ECMAScript-Spezifikation)
indexOf
, wird das RegExp als Zeichenfolge behandelt und der Index der Zeichenfolge zurückgegeben, falls gefunden. Wenn Sie jedoch ein RegExp an übergebenincludes
, wird eine Ausnahme ausgelöst .Performance
Wie 538ROMEO hervorhob ,
includes
kann es ein wenig (sehr winzig) etwas langsamer sein (da es als erstes Argument nach einem regulären Ausdruck suchen muss) alsindexOf
aber in Wirklichkeit macht dies keinen großen Unterschied und ist vernachlässigbar.Geschichte
String.prototype.includes()
wurde in ECMAScript 2015 eingeführt, währendArray.prototype.includes()
es in ECMAScript 2016 eingeführt wurde. Verwenden Sie die Browserunterstützung mit Bedacht.String.prototype.indexOf()
undArray.prototype.indexOf()
sind in der ES5-Ausgabe von ECMAScript vorhanden und werden daher von allen Browsern unterstützt.quelle
indexOf
gibttrue
nach expliziter Einstellungundefined
in ein Array:let arr=[undefined];
oderlet arr=[];arr[0]=undefined;
Nowarr.indexOf(undefined) === 0
undefined
: Der Grund ist, dass.includes
fehlende Elemente als behandelt werdenundefined
, während sie.indexOf()
ignoriert werden. Sie können auch fehlende Elemente mit erstellenarr[number beyond length] = whatever
..includes()
nur Saiten gegessen werden. In Wirklichkeit zwingen beide Methoden alles so gut wie möglich zu einer Saite. Regex wird ausdrücklich als Argument ausgeschlossen.includes()
, um zukünftige Ergänzungen des Standards gemäß dem aktuellen Entwurf zu ermöglichen.Konzeptionell sollten Sie indexOf verwenden, wenn Sie die Position indexOf verwenden möchten. Geben Sie dazu einfach den Wert zu extrahieren oder über das Array zu operieren, dh verwenden Sie Slice, Shift oder Split, nachdem Sie die Position des Elements erhalten haben. Auf der anderen Seite verwendet Use Array.includes nur, um zu wissen, ob sich der Wert innerhalb des Arrays befindet und nicht die Position, da Sie sich nicht darum kümmern.
quelle
indexOf()
undincludes()
beide können verwendet werden, um Elemente in einem Array zu finden, jedoch liefert jede Funktion unterschiedliche Rückgabewerte.indexOf
Gibt eine Zahl zurück (-1
wenn das Element nicht im Array vorhanden ist, oder die Array-Position, wenn das Element vorhanden ist).includes()
Gibt einen booleschen Wert (true
oderfalse
) zurück.quelle