Intl.Collator 是 JavaScript 中专为国际化排序设计的构造函数,支持按语言语义规则智能比较字符串,需指定 locale 和 sensitivity 参数,推荐复用实例以提升性能,处理多语言内容时应依语境选择 locale,并注意浏览器兼容性与降级策略。

Intl.Collator 是 JavaScript 中专为国际化排序设计的构造函数,它能按目标语言的语义规则(如重音、大小写、变音符号、字母顺序、连字处理等)对字符串进行智能比较,远超 String.prototype.localeCompare 的单次调用能力,更比 Array.prototype.sort() 配合简单 a > b 可靠得多。
明确指定 locale 和 sensitivity 以匹配语言习惯
不同语言对相同字符的排序优先级差异很大。例如德语中 ä 通常等价于 ae,而瑞典语中 ä 排在字母表末尾;法语区分重音但忽略大小写,而土耳其语的 I 和 i 有特殊映射。必须显式传入 locale(如 'de'、'sv'、'fr')和合适的 sensitivity:
-
base:只比较基础字符(如
a和á视为相等),适合不区分重音的场景 - accent:区分重音但忽略大小写(默认值),适用于法语、西班牙语等
- case:区分大小写但忽略重音(较少用)
-
variant:最精细,同时区分重音、大小写、标点等(如
a、á、A、"a"全不同)
复用 Collator 实例提升性能
每次调用 collator.compare(a, b) 都是轻量操作,但反复新建 Intl.Collator 实例会带来开销,尤其在排序大量数据时。应将实例缓存或作为常量定义:
// ✅ 推荐:复用同一实例
const collator = new Intl.Collator('zh-Hans', { sensitivity: 'accent' });
['苹果', '香蕉', '橙子'].sort(collator.compare);
// ❌ 不推荐:每次排序都新建
['苹果', '香蕉', '橙子'].sort((a, b) => new Intl.Collator('zh-Hans').compare(a, b));
处理混合语言内容时按语境选择 locale
数组中若含多语言字符串(如产品名含英文+日文+阿拉伯数字),不能简单用单一 locale。需根据业务语义决策:
- 面向中文用户的产品列表 → 用
'zh-Hans',汉字按拼音排序,英文字母按汉语拼音规则嵌入(如「iPhone」排在「iPad」前) - 面向国际用户的词典条目 → 用
'en-u-kn-true'(启用数字排序),并设置numeric: true让"item2"排在"item10"前 - 含阿拉伯语/希伯来语的双向文本 → 必须配合
usage: 'search'或usage: 'sort',并注意浏览器对 RTL 语言的支持程度
注意浏览器兼容性与降级策略
所有现代浏览器均支持 Intl.Collator,但旧版 Safari(≤12)或 Android WebView 可能缺少部分 locale 数据。可做简单检测并提供安全降级:
function safeSort(arr, options = {}) {
const { locale = 'en', ...rest } = options;
try {
const collator = new Intl.Collator(locale, rest);
return arr.sort(collator.compare);
} catch (e) {
// 回退到 localeCompare(仍比 a > b 强)
return arr.sort((a, b) => a.localeCompare(b, locale, rest));
}
}











