EDITAR : Esta respuesta se agregó originalmente hace 9 años. Hoy deberías usar localeCompare
con la sensitivity: 'accent'
opción:
function ciEquals(a, b) {
return typeof a === 'string' && typeof b === 'string'
? a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0
: a === b;
}
console.log("'a' = 'a'?", ciEquals('a', 'a'));
console.log("'AaA' = 'aAa'?", ciEquals('AaA', 'aAa'));
console.log("'a' = 'á'?", ciEquals('a', 'á'));
console.log("'a' = 'b'?", ciEquals('a', 'b'));
El { sensitivity: 'accent' }
le dice localeCompare()
que trate dos variantes de la misma letra base como la misma, a menos que tengan acentos diferentes (como en el tercer ejemplo) anterior.
Alternativamente, puede usar { sensitivity: 'base' }
, que trata dos caracteres como equivalentes siempre que su carácter base sea el mismo (por A
lo que se trataría como equivalente a á
).
Tenga en cuenta que el tercer parámetro de localeCompare
no es compatible con IE10 o navegadores móviles inferiores o determinados (consulte la tabla de compatibilidad en la página vinculada anteriormente), por lo que si necesita admitir esos navegadores, necesitará algún tipo de respaldo:
function ciEqualsInner(a, b) {
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
}
function ciEquals(a, b) {
if (typeof a !== 'string' || typeof b !== 'string') {
return a === b;
}
// v--- feature detection
return ciEqualsInner('A', 'a')
? ciEqualsInner(a, b)
: /* fallback approach here */;
}
Respuesta original
La mejor manera de hacer una comparación entre mayúsculas y minúsculas en JavaScript es usar el match()
método RegExp con la i
bandera.
Búsqueda sin distinción entre mayúsculas y minúsculas
Cuando ambas cadenas que se comparan son variables (no constantes), entonces es un poco más complicado porque necesita generar un RegExp a partir de la cadena, pero pasar la cadena al constructor RegExp puede resultar en coincidencias incorrectas o fallas si la cadena tiene expresiones regulares especiales personajes en el mismo.
Si le importa la internacionalización, no la use toLowerCase()
o toUpperCase()
no proporciona comparaciones precisas que no distingan entre mayúsculas y minúsculas en todos los idiomas.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
método javascript recién agregado . Solo es compatible con los navegadores modernos en el momento de la escritura (IE11 +). ver developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…