EcmaScript 6
Si está utilizando ES6, puede construir una matriz de los elementos y usar includes:
['a', 'b', 'c'].includes('b')
Esto tiene algunas ventajas inherentes sobre indexOfporque puede probar correctamente la presencia de NaNla lista, y puede igualar faltan elementos de la matriz como la del medio en [1, , 2]que undefined. includestambién funciona en matrices escritas en JavaScript como Uint8Array.
Si le preocupa la compatibilidad con el navegador (como IE o Edge), puede consultar Array.includesen CanIUse.Com , y si desea apuntar a un navegador o una versión de navegador que falta includes, recomiendo polyfill.io para polyfilling.
Sin una matriz
Puede agregar una nueva isInListpropiedad a las cadenas de la siguiente manera:
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;
}
}
Luego úsalo así:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
Puedes hacer lo mismo por Number.prototype.
Array.indexOf
Si está utilizando un navegador moderno, indexOfsiempre funciona. Sin embargo, para IE8 y versiones anteriores, necesitará un polyfill.
Si indexOfdevuelve -1, el elemento no está en la lista. Sin embargo, tenga en cuenta que este método no verificará correctamente NaNy, aunque puede coincidir con un explícito undefined, no puede coincidir con un elemento que falta undefinedcomo en la matriz [1, , 2].
Polyfill para indexOfo includesen IE, o cualquier otro navegador / versión que carece de soporte
Si no desea utilizar un servicio como polyfill.io como se mencionó anteriormente, siempre puede incluir en su propio código fuente polyfills personalizados que cumplan con los estándares. Por ejemplo, Mozilla Developer Network tiene uno para indexOf.
En esta situación en la que tuve que hacer una solución para Internet Explorer 7, "desarrollé mi propia versión" más simple de la indexOf()función que no cumple con los estándares:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Sin embargo, no creo que modificar Array.prototypesea la mejor respuesta a largo plazo. La modificación Objecty los Arrayprototipos en JavaScript pueden provocar errores graves. Debe decidir si hacerlo es seguro en su propio entorno. La nota principal es que iterar una matriz (cuando Array.prototype ha agregado propiedades) for ... indevolverá el nuevo nombre de la función como una de las teclas:
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!
Su código puede funcionar ahora, pero en el momento en que alguien en el futuro agregue una biblioteca de JavaScript de terceros o un complemento que no esté protegiendo celosamente contra las claves heredadas, todo puede romperse.
La forma antigua de evitar esa ruptura es, durante la enumeración, verificar cada valor para ver si el objeto realmente lo tiene como una propiedad no heredada con if (arr.hasOwnProperty(x))y solo luego trabajar con eso x.
La nueva forma ES6 para evitar este problema llave extra-es utilizar ofen lugar de in, for (let x of arr). Sin embargo, a menos que pueda garantizar que todo su código y las bibliotecas de terceros se adhieran estrictamente a este método, a los fines de esta pregunta, es probable que solo desee usar includescomo se indicó anteriormente.