string.localeCompare
string.localeCompare
localeCompare()
方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。
新的 locales 、options
参数能让应用程序定制函数的行为即指定用来排序的语言。 locales
和options
参数是依赖于具体实现的,在旧的实现中这两个参数是完全被忽略的。
语法
referenceStr.localeCompare(compareString[, locales[, options]])
参数
查阅浏览器支持部分来确定哪些浏览器支持 locales
参数和 options
参数, 在功能检测中检查对 locales
、options
参数的支持。
compareString
用来比较的字符串
locales
可选。 用来表示一种或多种语言或区域的一个符合 BCP 47标准的字符串或一个字符串数组。locales
参数的一般形式与解释, 详情请参考Intl page。 下列的 Unicode 扩展关键词是允许的:
co为了某些地域多样的排序规则。可能的值包括: "big5han", "dict", "direct", "ducet", "gb2312", "phonebk", "phonetic", "pinyin", "reformed", "searchjl", "stroke", "trad", "unihan"。 "standard" 和"search" 这两个值是被忽略的; 它们被 options 的属性 usage 代替(往下看)。kn指定数值排序是否应该被使用, 像是这样 "1" < "2" < "10"。 可能的值是 "true" 和 "false"。 这个选项能被通过options 属性设置或通过 Unicode 扩展。 假如两个都被设置了, 则 options 优先。("language-region-u-kn-true|false")kf指定是否优先对大写字母或小写字母排序。 可能的值有 "upper", "lower", 或 "false" (use the locale's default)。这个选项能被通过options 属性设置或通过 Unicode 扩展。假如两个都被设置了, 则 options 优先。("language-region-u-kf-upper|lower|false")
可选。 支持下列的一些或全部属性的一个对象:
localeMatcher
地域匹配算法的使用. 可能的值是 "lookup"
和 "best fit"
; 默认的值是 "best fit"
。更多相关的资料, 请参考 Intl page.usage
指定比较的目标是排序或者是搜索. 可能的值是 "sort"
和 "search"
; 默认是 "sort"
.sensitivity
Which differences in the strings should lead to non-zero result values. 可能的有:
"base"
: 只有不同的字母字符串比较是不相等的. 举个例子:a ≠ b
,a = á
,a = A
.
"accent"
: 只有不同的字母或读音比较是不相等的. 举个例子:a ≠ b
,a ≠ á
,a = A
.
"case"
: 只有不同的字母或大小写比较是不相等的. 举个例子:a ≠ b
,a = á
,a ≠ A
.
"variant"
: 不同的字母或读音及其它有区别的标志或大小写都是不相等的, 还有其它的差异可能也会考虑到. 举个例子:a ≠ b
,a ≠ á
,a ≠ A
.
默认值是"variant"
用法"sort"
; 它的语言环境依赖于使用"search"
。
ignorePunctuation指定是否忽略标点. 可能的值是 true and false; 默认为 false.numeric是否指定使用数字排序, 像这样 "1" < "2" < "10". 可能的值是 true 和 false; 默认为 false. 这个选项能被通过options 属性设置或通过 Unicode 扩展。假如两个都被设置了, 则 options 优先。 实现不用必须支持这个属性.caseFirst指定大小写有限排序. 可能的值有 "upper", "lower", or "false" (use the locale's default 默认为 "false". 这个选项能被通过options 属性设置或通过 Unicode 扩展。假如两个都被设置了, 则 options 优先。 实现不用必须支持这个属性.
返回值
如果引用字符存在于比较字符之前则为负数
; 如果比较字符存在于引用字符之后则为正数
; 相等的时候返回 0
.
描述
返回一个数字表示是否引用字符串
在排序中位于比较字符串
的前面,后面,或者二者相同。
- 当
引用字符串
在比较字符串
前面时返回 -1
- 当
引用字符串
在比较字符串
后面时返回 1
- 相同位置时返回 0
切勿依赖于 -1 或 1 这样特定的返回值。
不同浏览器之间(以及不同浏览器版本之间)返回的正负数的值各有不同,因为W3C规范中只要求返回值是正值和负值,而没有规定具体的值。一些浏览器可能返回-2或2或其他一些负的、正的值。
示例
使用localeCompare()
// The letter "a" is before "c" yielding a negative value
'a'.localeCompare('c' // -2 or -1 (or some other negative value)
// Alphabetically the word "check" comes after "against" yielding a positive value
'check'.localeCompare('against' // 2 or 1 (or some other positive value)
// "a" and "a" are equivalent yielding a neutral value of zero
'a'.localeCompare('a' // 0
array排序
localeCompare
排序数组不区分大小写。
var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort((a, b) => a.localeCompare(b) // ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
检查浏览器对扩展参数的支持
locales
和 options
参数还没有被所有阅览器所支持。检查是否被支持, 使用 "i" 参数 (a requirement that illegal language tags are rejected) 判断是否有异常RangeError
抛出:
function localeCompareSupportsLocales() {
try {
'foo'.localeCompare('bar', 'i'
} catch (e) {
return e.name === 'RangeError';
}
return false;
}
使用locales 参数
在不同的语言下 localeCompare()
所提供的结果是不一致的。 为了能让用户得到正确的比较值, 通过使用locales
参数来提供要比较的语言 (and possibly some fallback languages)
console.log('ä'.localeCompare('z', 'de') // a negative value: in German, ä sorts before z
console.log('ä'.localeCompare('z', 'sv') // a positive value: in Swedish, ä sorts after z
使用 options 参数
localeCompare()
所提供的结果可以通过 options
参数来制定:
// in German, ä has a as the base letter
console.log('ä'.localeCompare('a', 'de', { sensitivity: 'base' }) // 0
// in Swedish, ä and a are separate base letters
console.log('ä'.localeCompare('a', 'sv', { sensitivity: 'base' }) // a positive value
性能
当比较大量字符串时, 比如比较大量数组时, 最好创建一个Intl.Collator
对象并使用compare
属性所提供的函数。
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 3rd Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.2. |
ECMAScript 5.1 (ECMA-262)The definition of 'String.prototype.localeCompare' in that specification. | Standard | |
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'String.prototype.localeCompare' in that specification. | Standard | |
ECMAScript Latest Draft (ECMA-262)The definition of 'String.prototype.localeCompare' in that specification. | Living Standard | |
ECMAScript Internationalization API 1.0 (ECMA-402)The definition of 'String.prototype.localeCompare' in that specification. | Standard | locale and option parameter definitions. |
ECMAScript Internationalization API 2.0 (ECMA-402)The definition of 'String.prototype.localeCompare' in that specification. | Standard | |
ECMAScript Internationalization API 4.0 (ECMA-402)The definition of 'String.prototype.localeCompare' in that specification. | Draft | |
浏览器兼容性
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
locales | 24 | (Yes) | 29 | 11 | 15 | 10 |
options | 24 | (Yes) | 29 | 11 | 15 | 10 |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
locales | No | 26 | ? | No | No | No | 10 |
options | No | 26 | ? | No | No | No | 10 |