我正在处理如下所示的Javascript代码:

let arr = [
  '1 Hello',
  '2 Hello',
  '3 Hello',
  '4 Hello',
  ';1',
  'z',
  '%1',
  '110 Hello',
  '100 Hello',
  'a',
  'Z',
  '00',
  '21 Hello',
  '9  Hello',
  '13 Hello',
  '10000 Hello',
  '0 Hello',
  'A'
  ];


arr.sort( (a, b) => {
  return a.localeCompare(b, 'en', {
    numeric: true
  })
} ).forEach( ml => { console.log(ml) });


上面的Javascript打印以下o/p:
;1
%1
00
0 Hello
1 Hello
2 Hello
3 Hello
4 Hello
9  Hello
13 Hello
21 Hello
100 Hello
110 Hello
10000 Hello
a
A
z
Z
=> undefined

问题陈述:

我想知道为什么在O/P中;1%1之前出现,以及其他字符串在这里如何排序?

最佳答案

tldr;浏览器特定的实现。最近“标准化”。
在我的答案中,我认为问题不在于JS中的.sort()数组方法,而是关于.localeCompare()字符串方法的输出。如果我们转到方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare的MDN描述,我们可以找到定义:



以及指向规范的链接:https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.localecompare。该规范摘录如下:



您可以找到Chromium的“错误”报告“ localeCompare实现与其他浏览器”不同:https://bugs.chromium.org/p/v8/issues/detail?id=459,-例如:

in v8 version 1.3.13.5, i get these results for the final sort:
A,R,Z,a,q,z,ä,æ

safari produces:
A,a,ä,æ,q,R,Z,z

firefox produces:
a,A,ä,æ,q,R,z,Z

one of the answers:



当前,使用AFAIK进行比较以使用i18n Intl API规范。您可以在规范中找到更多关于比较规则的信息:https://www.ecma-international.org/ecma-402/2.0/#collator-objects。该文档在比较选项上也有此注释:



因此,您可以将输出调整到特定水平。我希望这会有所帮助,谢谢:)

10-07 23:54