EcmaScript 6
Якщо ви використовуєте ES6, ви можете сконструювати масив елементів та використовувати includes:
['a', 'b', 'c'].includes('b')
Це має деякі переваги по порівнянні з властивими , indexOfоскільки він може належним чином перевірити на наявність NaNв списку, і може відповідати відсутньою елементів масиву , таким як середні один в [1, , 2]к undefined. includesтакож працює на набраних JavaScript масивах, таких як Uint8Array.
Якщо ви стурбовані підтримкою веб-переглядача (наприклад, для IE або Edge), ви можете перевірити Array.includesв CanIUse.Com , і якщо ви хочете націлити на браузер або версію браузера, яка відсутня includes, я рекомендую polyfill.io для поліфілінгу.
Без масиву
Ви можете додати нове isInListвластивість до рядків таким чином:
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
Потім використовуйте його так:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
Можна зробити те ж саме і для Number.prototype.
Array.indexOf
Якщо ви використовуєте сучасний браузер, indexOfзавжди працює. Однак для IE8 і більш ранніх вам знадобиться поліфіл.
Якщо indexOfповертається -1, елемент не знаходиться в списку. Однак майте на увазі, що цей метод не буде належним чином перевіряти NaN, і хоча він може відповідати явним undefined, він не може відповідати відсутньому елементу, undefinedяк у масиві [1, , 2].
Polyfill для indexOfабо includesв IE або будь-який інший браузер / версія відсутня підтримка
Якщо ви не хочете користуватися такою послугою, як polyfill.io, як згадувалося вище, ви завжди можете включити у свій власний вихідний код спеціальні спеціальні поліфіли. Наприклад, Мережа розробників Mozilla має для indexOf.
У цій ситуації, коли мені довелося зробити рішення для Internet Explorer 7, я "прокрутив власну" більш просту версію indexOf()функції, яка не відповідає стандартам:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Однак я не думаю, що модифікація Array.prototypeє найкращою відповіддю в довгостроковій перспективі. Модифікація Objectта Arrayпрототипи в JavaScript може призвести до серйозних помилок. Вам потрібно вирішити, чи безпечно це робити у власному оточенні. Основне зауваження полягає в тому, що ітерація масиву (коли Array.prototype додає властивості) з for ... inповерне нове ім'я функції в якості однієї з клавіш:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
Ваш код може працювати зараз, але коли хтось у майбутньому додасть сторонній бібліотеку JavaScript або плагін, який ревно не захищає від успадкованих ключів, все може зламатися.
Старий спосіб уникнути поломки - це під час перерахування перевіряти кожне значення, щоб побачити, чи об'єкт насправді має його як не успадковане властивість if (arr.hasOwnProperty(x))і лише потім працювати з цим x.
Новий ES6 спосіб уникнути цього додаткового ключа проблеми полягає у використанні ofзамість in, for (let x of arr). Однак, якщо ви не зможете гарантувати, що всі ваші кодові та сторонні бібліотеки суворо дотримуються цього методу, то для цілей цього питання ви, ймовірно, просто захочете використовувати, includesяк зазначено вище.