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
як зазначено вище.