Мотивація
Під час використання масивів 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має набагато гіршу підтримку браузера.