编辑:这个答案最初是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'));
The { sensitivity: 'accent' }
Tells 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()
带有i
标志的RegExp 方法。
不区分大小写的搜索
当两个被比较的字符串都是变量(不是常量)时,这会稍微复杂一点,因为您需要从字符串生成RegExp,但是如果字符串具有特殊的regex,则将字符串传递给RegExp构造函数可能会导致不正确的匹配或失败的匹配里面的字符。
如果您关心国际化,请不要使用toLowerCase()
或toUpperCase()
因为它不能在所有语言中提供不区分大小写的准确比较。
http://www.i18nguy.com/unicode/turkish-i18n.html
.localeCompare()
javascript方法。在撰写本文时(IE11 +)仅受现代浏览器支持。看到developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...