localCompare

197 阅读5分钟

用于基于特定语言环境(locale)的规则比较两个字符串的相对顺序。

一、基本用法

stringObject.localeCompare(target, locales, options)
  • stringObject

必填参数,表示调用该方法的 string 类型对象,即要进行比较的原字符串

  • target

必填参数,也是一个 string 类型对象,即与 stringObject 进行比较的目标字符串

  • locales

可选参数,一个数组或者单个字符串,指定了用于比较的特定语言环境(如['en-US', 'fr'])。如果不传或传入undefined,则使用用户浏览器的默认语言环境。

  • oprions

可选参数,一个对象,用于配置比较行为的选项,例如:大小写敏感、排序风格等

二、返回值

localeCompare 方法返回一个整数值,表示两个字符串的相对位置关系。

  • <0

stringObject 在 target 字符串之前(按照指定语言环境的排序规则)

  • =0

stringObject 与 target 相等,或者根据所使用的语言环境规则,两者没有明显的排序差异

  • 0

stringObject 在 target 字符串之后(按照指定语言环境的排序规则)

三、locales参数

1.类型与格式

locales可以是一个字符串,表示单一的语言环境,如"en-US"(美国英语),"fr-FR"(法国法语)

更常见的是作为一个数组进行传递,包含多个环境语言标识,按优先级从高到低排列。如:

['zh-CN', 'zh', 'en-US']

表示首选中文(简体,中国),其次是通用中文,最后是美国英语

2.语言标识符结构

  • 一个完整的语言环境标识符由两部分组成:语言代码(ISO639标准)和区域代码(ISO3166)标准,中间用连字符分隔。
  • 语言代码通常是两个小写字母,如:"en"(英语),"es"(西班牙语),"zh"(中文)。
  • 区域代码通常是两个大写字母,如:"US"(美国),"ES"(西班牙),"zh"(中国),某些情况下可能包含更具体的子区域,如"en-GB"(英国英语)或 "es-419"(拉丁美洲西班牙语)。
  • 对于不区分区域或不需要特定区域设置的情况下,仅使用语言代码即可。

3.扩展语言标签

除了基本的语言环境标识符外,还可以添加扩展标签来指定更具体的语言特性或变体。扩展标签以"-"后跟单个字母或"-"加上双字母作为前缀。常见的扩展关键字:

代码含义
u-co排序方式(collation),如 phonebk(电话簿排序)、search(适合搜索引擎的排序)等
nu数字系统(numbering system),如 arab(阿拉伯数字)、thai(泰文数字)等
实例:

"sr-Latn-RS-u-nu-latn"

指定了字符串比较时应遵循塞尔维亚语(拉丁字母)、塞尔维亚地区,并且在处理数字时使用拉丁数字系统

代码含义
sr ISO 639 语言代码,代表塞尔维亚语(Serbian)
LatnISO 15924 脚本代码,表示拉丁字母(Latin script)。这意味着在比较字符串时,应该使用拉丁字母的塞尔维亚语变体,而不是西里尔字母(Cyryllic)或其他变体
RSISO 3166 国家/地区代码,指代塞尔维亚共和国(Republic of Serbia)。此标识明确了塞尔维亚语在塞尔维亚境内的特定方言、拼写、词汇或约定,与其他使用塞尔维亚语的地区可能有所不同
-u-Unicode 扩展序列的前缀,表示接下来的选项是按照 Unicode Locale Identifier (ULI) 规范定义的特定属性或设置
nu-latn在 -u- 后面,nu 是 Unicode 扩展关键字,表示“数字系统”(Numbering System)。这里的值 latn 指定在该语言环境中,应使用拉丁数字(0-9)作为数字的书写系统。这意味着在涉及数字的字符串比较或格式化时,应使用拉丁数字而非其他可能存在的数字表示方式(如塞尔维亚西里尔数字等)

四、options参数

1.sensitivity

作用:控制大小写和变音符号的敏感度

可选值:

  • base:只考虑基本字符,忽略大小写和变音符号的差异
  • accent:考虑变音符号差异,但忽略大小写
  • case:考虑大小写差异,但忽略变音符号
  • variant:同时考虑大小写和变音符号差异,以及其他可能影响排序的细微差别(如字母表中的特殊排序规则)
  • isensitive:等同于base,旧版遗留

2.igonrePunctuation

作用:是否忽略标点符号

类型:boolean

默认值:false

3.numeric

作用:当字符串包含数字时,是否按数值而非字面值进行比较 

类型:boolean

默认值:false

4.caseFirst

作用:控制大小写在排序中的优先级

可选值:

  • upper:大写字母优先
  • lower:小写字母优先
  • false或null:使用默认顺序排序,会因语言环境而异

5.usage

作用:指定比较的用途,影响排序规则的选择

可选值:

  • sort:用于排序,选择最严格的排序规则
  • search:用于搜索匹配,选择宽松的排序规则,提高匹配效率

6.collation

作用:指定特定的排序规则,覆盖语言环境默认的排序规则

类型:字符串,通常是一个符合 CLDR Collation Spec 的标识符

五、注意事项

  • 浏览器兼容性:尽管 localeCompare() 是 ECMAScript 标准的一部分,但在不同浏览器和版本中可能存在实现差异,尤其是在处理复杂的语言环境和选项时。确保针对目标环境测试代码。
  • 性能:对于大规模的数据排序,连续调用 localeCompare() 可能会带来性能开销。在性能关键的场景中,可以考虑先将数据转换为统一格式(如移除变音符号、统一大小写等),或者使用更高效的排序算法。