JavaScript:Chrome错误地比较字符串

时间:2016-10-03 13:46:25

标签: javascript google-chrome

有人可以解释这是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"]

Firefox给出了预期的结果:

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

2 个答案:

答案 0 :(得分: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);

...或(doh)只改为i2.localeCompare(i1)

答案 1 :(得分:2)

您的排序比较器功能不符合合同。如果第一个参数应在第二个参数之前排序,则排序比较器应返回负数,如果第二个参数应在第一个参数之前排序,则返回正数;如果参数已经按可接受的顺序排序,则返回0。

您的函数返回一个布尔值,它将被解释为01。这意味着当排序操作以不同的顺序使用相同的两个值调用它时,该函数可能会返回冲突的结果。

考虑列表中的两个值,“a”和“b”。如果排序操作像这样调用你的回调:

var ordering = yourCallback("a", "b"); // not really how it looks of course

然后你的回调将返回0,并且sort函数将把它解释为意味着这两个值已经按顺序排列。如果它稍后调用函数 this

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

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

该语言的规范没有规定用于.sort()的实现的算法,Firefox和Chrome中的JavaScript运行时在它们如何响应异常排序比较器功能的细节上肯定是不同的