JavaScript: Chrome错误地比较字符串

3

有人能解释一下这是Chrome的一个错误还是我比较字符串时出了问题吗?

在Chrome中,排序方法提供了奇怪(至少对我来说)的结果。 我做了以下操作:

var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"]

a.sort((i1,i2)=>i1>i2)

["7", "c", "b", "a", "9", "8", "6", "5", "4", "3", "2", "1"]

火狐浏览器给出了预期的结果:

["c", "b", "a", "9", "8", "7", "6", "5", "4", "3","2","1"]
2个回答

5
这是你的 sort 回调函数中存在问题,而不是JavaScript引擎的问题。
回调函数必须返回一个数字,而不是布尔值:
  • 0 如果两个参数相等
  • <0 如果第一个参数“小于”第二个参数
  • >0 如果第二个参数“小于”第一个参数
如果你想按自然排序升序排列数组并得到正确的返回值,localeCompare 非常方便。但在你的情况下,你需要相反的结果,所以要对它取反。

var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"]
a.sort((i1, i2) => -i1.localeCompare(i2));
console.log(a);

...或者(呃)只需执行i2.localeCompare(i1)即可。


@evolutionxbox: :-) - T.J. Crowder
我以为那是我不知道的一些秘密知识 =P - evolutionxbox

2
您的排序比较函数没有遵循合同。排序比较器应返回负数,如果第一个参数应该在第二个参数之前排序,则返回正数,如果第二个参数应该在第一个参数之前排序,则返回0,如果参数已经按可接受的顺序排列。
您的函数返回一个布尔值,这将被解释为01。这意味着当排序操作以不同的顺序使用相同的两个值调用它时,函数可能会返回冲突的结果。
考虑列表中的两个值,“a”和“b”。如果排序操作像这样调用您的回调函数:
var ordering = yourCallback("a", "b"); // not really how it looks of course

如果您的回调函数返回0,则排序函数将解释为这两个值已经按顺序排列。如果稍后像这样调用该函数:

var ordering = yourCallback("b", "a");

它将得到1。这与相同两个参数的第一个结果不一致。

语言规范没有规定用于实现.sort()的算法,Firefox和Chrome中的JavaScript运行时在响应异常排序比较器函数的细节方面肯定是不同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接