localeCompare 是 JavaScript 字符串原生方法,用于按语言环境进行语义化、国际化感知比较,返回负数(调用者在前)、0(相等)或正数(调用者在后),支持 locale 和 options 参数控制大小写、重音、数字排序等行为,需统一配置以确保排序稳定。

localeCompare 是 JavaScript 字符串的原生方法,用于按当前语言环境(locale)对字符串进行**语义化、国际化感知的比较**,不是简单按 Unicode 码点排序。它的返回值是数字:负数表示调用者排在参数之前,0 表示相等,正数表示调用者排在参数之后。
区分大小写与语言规则优先
不同于 === 或 charCodeAt(),localeCompare 默认尊重语言习惯。例如在德语中,"ä" 通常等价于 "ae";在瑞典语中,"z" 排在 "å" 之后。大小写不总是决定顺序——某些 locale(如土耳其语)对 i/I 有特殊映射,"İ".localeCompare("i", "tr") 可能返回非零值。
支持选项控制比较行为
第二个参数可传入 locale 字符串(如 "zh-Hans"),第三个参数是配置对象,常用键包括:
-
sensitivity:设为
"base"忽略大小写和重音(只比基础字符),"accent"区分重音但忽略大小写,"case"仅区分大小写,"variant"全区分(默认) -
numeric:设为
true可让"a10"排在"a2"之后(自然排序),否则按字符串逐字符比较 -
usage:设为
"search"时启用更宽松的匹配逻辑(如忽略标点、全半角差异)
排序时需统一 locale 和选项
直接用于 Array.prototype.sort() 时,必须确保所有比较使用相同的 locale 和配置,否则结果不稳定。例如:
立即学习“Java免费学习笔记(深入)”;
["中文", "english", "日本語"].sort((a, b) => a.localeCompare(b, "zh-Hans"));
若混用不同 locale(如部分用 "en"、部分用 "ja"),排序结果无意义。浏览器会尝试回退到系统 locale,但行为不可靠,建议显式指定。
注意浏览器兼容性与性能边界
所有现代浏览器均支持,但旧版 Safari 对某些 locale(如 "zh-Hant")支持有限。大量字符串高频调用时,localeCompare 比 String.prototype.toLowerCase() + === 慢得多,因涉及 ICU 规则解析。若只需 ASCII 英文大小写不敏感比较,用 a.toLowerCase() 更高效。


















