Помимо улучшения читаемости, есть ли преимущество includes
над indexOf
? Мне они кажутся идентичными.
В чем разница между этим
var x = [1,2,3].indexOf(1) > -1; //true
И это?
var y = [1,2,3].includes(1); //true
Помимо улучшения читаемости, есть ли преимущество includes
над indexOf
? Мне они кажутся идентичными.
В чем разница между этим
var x = [1,2,3].indexOf(1) > -1; //true
И это?
var y = [1,2,3].includes(1); //true
includes
имеет гораздо худшую поддержку браузера.includes
это не часть ES6 / ES2015. Это предложение для следующей версии ECMAScript, которое будет добавлено в этом году.includes
вообще НЕ поддерживается в IEОтветы:
tl; dr:
NaN
обрабатывается иначе:[NaN].indexOf(NaN) > -1
являетсяfalse
[NaN].includes(NaN)
являетсяtrue
Из предложения :
Дальнейшая информация:
SameValueZero
алгоритмStrict Equality Comparison
алгоритмисточник
undefined
путь.includes()
и не рассматриваются.indexOf()
.Если вас интересует производительность, на данный момент indexOf работает быстрее, но этот тест JSperf, как правило, показывает, что чем больше времени проходит, тем
includes()
быстрее будет большеindexOf
(я думаю, он будет оптимизирован дальше).ИМХО, я тоже предпочитаю писать,
if (arr.includes(el)) {}
так как он понятнее и удобнее, чемif (arr.indexOf(el) !== -1) {}
источник
.indexOf()
и.includes()
методы могут использоваться для поиска элемента в массиве или для поиска символа / подстроки в заданной строке.Использование в массиве
( Ссылка на спецификацию ECMAScript)
indexOf
использует строгое сравнение равенства, тогда какincludes
использует алгоритм SameValueZero . По этой причине возникают следующие два момента различий.Как указал Феликс Клинг , в случае
NaN
.undefined
.Использование в строке
( Ссылка на спецификацию ECMAScript)
indexOf
, он будет рассматривать RegExp как строку и вернет индекс строки, если он найден. Однако, если вы передадите RegExp вincludes
, он выдаст исключение.Производительность
Как указал 538ROMEO , это
includes
может быть немного (очень крошечное) немного медленнее (поскольку ему нужно проверять регулярное выражение в качестве первого аргумента), чем,indexOf
но на самом деле это не имеет большого значения и незначительно.История
String.prototype.includes()
был представлен в ECMAScript 2015, тогда какArray.prototype.includes()
был представлен в ECMAScript 2016. Что касается поддержки браузеров, используйте их с умом.String.prototype.indexOf()
иArray.prototype.indexOf()
присутствуют в версии ECMAScript для ES5 и, следовательно, поддерживаются всеми браузерами.источник
indexOf
даетtrue
после явной установкиundefined
в массив:let arr=[undefined];
orlet arr=[];arr[0]=undefined;
Nowarr.indexOf(undefined) === 0
undefined
: Причина в том, что.includes
пропущенные элементы обрабатываются какundefined
, а.indexOf()
игнорируются. Вы также можете «создать» недостающие элементы с помощьюarr[number beyond length] = whatever
..includes()
ест только струны. На самом деле оба метода как можно лучше приводят к строке что угодно. Regex специально исключен в качестве аргумента ,.includes()
чтобы позволить для будущих дополнений к стандарту в соответствии с текущим проектом.По идее, вы должны использовать indexOf, когда хотите использовать позицию indexOf, которая просто дает вам извлекать значение или работать с массивом, то есть с помощью среза, сдвига или разделения после того, как вы получили позицию элемента. С другой стороны, Use Array.includes только для того, чтобы знать, находится ли значение внутри массива, а не позиция, потому что вам это не важно.
источник
indexOf()
иincludes()
оба могут использоваться для поиска элементов в массиве, однако каждая функция дает разные возвращаемые значения.indexOf
возвращает число (-1
если элемент отсутствует в массиве, или позицию массива, если элемент присутствует).includes()
возвращает логическое значение (true
илиfalse
).источник