Javascript String.prototype.localeCompare处理套管不一致?

Javascript String.prototype.localeCompare处理套管不一致?,javascript,string,sorting,Javascript,String,Sorting,请参见以下示例。所有示例都在Chrome 76.0.3809.100、Firefox 68.0.2和Node.js 11.15.0中进行了测试。所有这些都产生了相同的结果 为了完整性起见,提供了所有相关选项(但是它们并不真正起作用:默认的敏感度是'variant',其工作方式实际上与'case'对于非注释字符,使用默认的'sort'用法相同) 没有任何设置能够解决下面详述的矛盾。我还尝试了几种语言选项,但没有成功 示例1。 以下是正确的:'a'位于'b'之前 const result='a'.l

请参见以下示例。所有示例都在Chrome 76.0.3809.100、Firefox 68.0.2和Node.js 11.15.0中进行了测试。所有这些都产生了相同的结果

为了完整性起见,提供了所有相关选项(但是它们并不真正起作用:默认的
敏感度
'variant'
,其工作方式实际上与
'case'
对于非注释字符,使用默认的
'sort'
用法相同)

没有任何设置能够解决下面详述的矛盾。我还尝试了几种语言选项,但没有成功

示例1。

以下是正确的:
'a'
位于
'b'
之前

const result='a'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例2。

以下是正确的:对于
caseFirst:“lower”
set,
'b'
位于
'b'
之前

const result='b'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例3。

以下也是正确的。实现不需要支持
caseFirst
选项,但它确实需要。如果设置了
caseFirst:'upper'
,则
'b'
位于
'b'
之后

const result='b'.localeCompare('b','en','{
敏感度:“案例”,
用法:'sort',
案例一:“上”
});
// 1
示例4.

以下也是正确的。由于
'b'
'b'
之前,因此
'b{anything}
'b{anything}'之前:

const result='ba'.localeCompare('ba','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// -1
示例5.

以下
1
结果不正确我认为,因为它与
'b{anything}'
前面的
'b{anything}'语句相矛盾:

const result='bb'.localeCompare('Ba','en','{
敏感度:“案例”,
用法:'sort',
案例一:“较低”
});
// 1
据此,
'bb'
位于
'Ba'
之后。设置
敏感度:'base'
(不敏感地比较大小写)或
caseFirst:'upper'
(它们使用这些设置生成相同的
1
输出-正确-,我尝试过)

但是有了这个设置,我希望有一个
-1
结果:
'bb'
'Ba'
之前,按字母顺序排列,
'b'
'b'
确定它们的顺序(并且
'b'
'b'
之前,如例2所示)


为什么
localeCompare
的行为是这样的?

它实际上不是这样工作的,因为它将所有的字母位置(而不是字符串)与字母的位置进行比较

您可以将每个字母和另一个字符串进行比较(可能这也需要处理最小长度的字母)

var数组=['a','b','bb','bb','ba','ba','b','ba'];
array.sort();
log(…数组);
sort((a,b)=>a.localeCompare(b,'kf',{sensitivity:'case',caseFirst:'lower'});
log(…数组);
array.sort((a,b)=>{
var-r;
一些((c,i)=>r=c.localeCompare(b[i],'kf',{sensitivity:'case',caseFirst:'lower'}));
返回r;
});

log(…数组)感谢您的回答和解决方法。您能否更准确地描述一下,
localeCompare
发生了什么,以及为什么?我真的没听懂。