EDITAR : Esta respuesta se agregó originalmente hace 9 años. Hoy deberías usar localeComparecon 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 Alo que se trataría como equivalente a á).
Tenga en cuenta que el tercer parámetro de localeCompareno 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 ibandera.
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/…