JavaScript:Chrome不正确地比较字符串

问题描述:

任何人都可以解释是Chrome中的错误还是错误地比较字符串?JavaScript: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"] 

这是一个错误在你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)代替。

+0

@evolutionxbox :-) –

+0

我以为这是一些秘密知识,我不知道= P – evolutionxbox

您的排序比较功能不符合合同。如果第一个参数应该在第二个参数之前排序,则排序比较器应该返回一个负数;如果第二个参数应该排在第一个之前,排序比较器应该返回一个正数;如果参数已经按照可接受的顺序排序,则为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运行时在它们如何响应异常排序比较函数的细节上明显不同。