Мотивація
Під час використання масивів ECMAScript зазвичай бажано визначити, чи містить масив елемент. Переважаючий зразок цього є
if (arr.indexOf(el) !== -1) {
...
}
з різними іншими можливостями, наприклад arr.indexOf(el) >= 0
, або навіть ~arr.indexOf(el)
.
Ці моделі мають дві проблеми:
- Вони не можуть "сказати, що ви маєте на увазі": замість того, щоб запитати про те, чи містить масив елемент, ви запитуєте, що є індексом першого появи цього елемента в масиві, а потім порівнюєте його або біт-виворіть його, щоб визначити відповідь на ваше власне запитання.
- Вони не спрацьовують
NaN
, оскільки indexOf
використовує суворе порівняння рівності і таким чином [NaN].indexOf(NaN) === -1
.
Пропоноване рішення
Ми пропонуємо додати Array.prototype.includes
метод таким чином, щоб вищезазначені зразки можна було переписати як
if (arr.includes(el)) {
...
}
Це має майже таку ж семантику, як і вище, за винятком того, що він використовує алгоритм порівняння SameValueZero замість суворого порівняння рівності, таким чином, [NaN].includes(NaN)
істинним.
Таким чином, ця пропозиція вирішує обидві проблеми, що спостерігаються в існуючому коді.
Додатково додаємо fromIndex
параметр, подібний до Array.prototype.indexOf
та String.prototype.includes
, за послідовністю.
includes
має набагато гіршу підтримку браузера.