Poza poprawioną czytelnością jest jeszcze coś do includes
pokonaniaindexOf
? Wydają mi się identyczne.
Jaka jest różnica między tym
var x = [1,2,3].indexOf(1) > -1; //true
I to?
var y = [1,2,3].includes(1); //true
javascript
ecmascript-7
Matt
źródło
źródło
includes
ma znacznie gorszą obsługę przeglądarki.includes
nie jest to część ES6 / ES2015. Jest to propozycja kolejnej wersji ECMAScript i zostanie dodana w tym roku.includes
w IE NIE jest obsługiwaneOdpowiedzi:
tl; dr:
NaN
jest traktowany inaczej:[NaN].indexOf(NaN) > -1
jestfalse
[NaN].includes(NaN)
jesttrue
Z propozycji :
Dalsza informacja:
SameValueZero
algorytmStrict Equality Comparison
algorytmźródło
undefined
przez.includes()
i nie są uważane za.indexOf()
.Jeśli zastanawiasz się nad wydajnością, na razie indexOf jest szybszy, ale ten test JSperf ma tendencję do pokazywania, że więcej czasu mija, więcej
includes()
będzie szybsze niżindexOf
(myślę, że zostanie zoptymalizowany dalej).IMHO, ja też wolę pisać,
if (arr.includes(el)) {}
ponieważ jest jaśniejszy i łatwiejszy w utrzymaniu niżif (arr.indexOf(el) !== -1) {}
źródło
.indexOf()
i.includes()
metod można użyć do wyszukania elementu w tablicy lub do wyszukania znaku / podłańcucha w danym ciągu.Wykorzystanie w Array
( Link do specyfikacji ECMAScript)
indexOf
używa ścisłego porównania równości, podczas gdyincludes
używa algorytmu SameValueZero . Z tego powodu pojawiają się następujące dwie różnice.Jak zauważył Felix Kling , zachowanie jest inne w przypadku
NaN
.undefined
.Użycie w ciągu znaków
( Link do specyfikacji ECMAScript)
indexOf
, potraktuje RegExp jako ciąg i zwróci indeks ciągu, jeśli zostanie znaleziony. Jednak jeśli przekażesz RegExp doincludes
, zgłosi wyjątek.Występ
Jak wskazał 538ROMEO ,
includes
może być trochę (bardzo malutki) nieco wolniejszy (ponieważ musi sprawdzić regex jako pierwszy argument) niż,indexOf
ale w rzeczywistości nie robi to dużej różnicy i jest pomijalne.Historia
String.prototype.includes()
zostało wprowadzone w ECMAScript 2015, natomiastArray.prototype.includes()
zostało wprowadzone w ECMAScript 2016. Jeśli chodzi o obsługę przeglądarek, korzystaj z nich mądrze.String.prototype.indexOf()
iArray.prototype.indexOf()
są obecne w wersji ES5 ECMAScript i dlatego są obsługiwane przez wszystkie przeglądarki.źródło
indexOf
dajetrue
po jawnym ustawieniuundefined
w tablicy:let arr=[undefined];
lublet arr=[];arr[0]=undefined;
Terazarr.indexOf(undefined) === 0
undefined
: Powodem jest to, że.includes
traktuje brakujące elementy jakoundefined
, a.indexOf()
ignoruje je. Możesz także „tworzyć” brakujące elementy za pomocąarr[number beyond length] = whatever
..includes()
je tylko struny. W rzeczywistości obie metody zmuszają wszystko do stworzenia struny najlepiej, jak potrafią. Regex jest specyficznie wyłączona jako argument.includes()
do umożliwienia przyszłych dodatków do standardu według obecnego projektu.Koncepcyjnie powinieneś użyć indexOf, gdy chcesz użyć pozycji indexOf, aby po prostu wyodrębnić wartość lub operować na tablicy, tj. Używając slice, shift lub split po uzyskaniu pozycji elementu. Z drugiej strony, użyj Array.includes tylko po to, aby wiedzieć, czy wartość znajduje się wewnątrz tablicy, a nie w pozycji, ponieważ nie dbasz o to.
źródło
indexOf()
iincludes()
mogą być używane do znajdowania elementów w tablicy, jednak każda funkcja zwraca inne wartości zwracane.indexOf
zwraca liczbę (-1
jeśli elementu nie ma w tablicy lub pozycję tablicy, jeśli element jest obecny).includes()
zwraca wartość logiczną (true
lubfalse
).źródło