最简单的方法(如果你不担心特殊的 Unicode 字符)是调用toUpperCase
:
var areEqual = string1.toUpperCase() === string2.toUpperCase();
编辑 :这个答案最初是在 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
它就将两个字符视为等效字符(因此A
将被视为等同于á
)。
请注意 ,IE10 或更低版本或某些移动浏览器不支持localeCompare
的第三个参数(请参阅上面链接的页面上的兼容性图表),因此如果您需要支持这些浏览器,则需要某种后备:
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 中进行不区分大小写的比较的最佳方法是使用 RegExp match()
方法和i
标志。
当比较的两个字符串都是变量(不是常量)时,它会有点复杂 ' 因为你需要从字符串生成一个 RegExp 但是将字符串传递给 RegExp 构造函数会导致错误的匹配或者如果字符串有特殊的正则表达式则匹配失败其中的人物。
如果您关心国际化,请不要使用toLowerCase()
或toUpperCase()
因为它不能在所有语言中提供准确的不区分大小写的比较。
在正则表达式的帮助下我们也可以实现。
(/keyword/i).test(source)
/i
是为了忽略大小写。如果没有必要,我们可以忽略并测试非区分大小写的匹配
(/keyword/).test(source)