РЕДАКТИРОВАТЬ : Этот ответ был первоначально добавлен 9 лет назад. Сегодня вы должны использовать localeCompare
с sensitivity: 'accent'
опцией:
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'));
{ sensitivity: 'accent' }
Говорит localeCompare()
лечить два варианта одной и той же базовой буквой, то же , если они не имеют разные акценты (как в третьем примере) выше.
В качестве альтернативы вы можете использовать { sensitivity: 'base' }
, который рассматривает два символа как эквивалентные, если их базовый символ одинаков (так A
что будет рассматриваться как эквивалентный á
).
Обратите внимание, что третий параметр localeCompare
не поддерживается в IE10 или более ранних версиях или в некоторых мобильных браузерах (см. Таблицу совместимости на странице, указанной выше), поэтому, если вам требуется поддержка этих браузеров, вам понадобится некоторый запасной вариант:
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 */;
}
Оригинальный ответ
Лучший способ выполнить сравнение без учета регистра в JavaScript - это использовать match()
метод RegExp с i
флагом.
Поиск без учета регистра
Когда обе сравниваемые строки являются переменными (не константами), то это немного сложнее, потому что вам нужно сгенерировать RegExp из строки, но передача строки в конструктор RegExp может привести к некорректным или неудачным совпадениям, если строка имеет специальное регулярное выражение персонажи в нем.
Если вы заботитесь о интернационализации, не используйте toLowerCase()
или, toUpperCase()
поскольку она не обеспечивает точного сравнения без учета регистра на всех языках.
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
метод javascript. Поддерживается только современными браузерами на момент написания (IE11 +). см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…