一种不同形式的排序方法?

时间:2016-07-13 11:51:00

标签: javascript arrays

在使用sort方法时,我可以将return a - b的return语句替换为return a > b并获得相同的结果,为什么? 代码如下:

arr.sort(function(a, b){
  return a > b;
}

似乎就像

一样
arr.sort(function(a, b){
  return a - b;
}

2 个答案:

答案 0 :(得分:1)

Array.sort()预计会有三种可能的结果:

  • 如果compareFunction(a,b)小于0,则将a排序为低于的索引 b,即a先来。
  • 如果compareFunction(a,b)返回0,则保留a 和b相互之间保持不变,但是要尊重 所有不同的元素。
  • 如果compareFunction(a,b)大于 0,将b排序为低于a的索引。

在您的情况下,第一个示例返回truefalse,但Array.sort()需要一个数字,因此它将true / false转换为数字,其中true = 1,false = 0。

无论如何,在ES6中,您的第一个代码段不起作用(现在也可以使用,但可以根据您的问题的评论中给出意想不到的结果),as described here,因为:

  

当给出a时,调用comparefn(a,b)总是返回相同的值v   特定的值对a和b作为它的两个参数。此外,   类型(v)是数字,而v不是NaN。

您的第一个代码段的返回类型为boolean

无论如何,在旧版本的ES中,它的工作原理是因为specifications 15.4.4.5 章节

  

对于一组值,函数是一致的比较函数,如果(a)对于任何两个值   (可能是相同的值)被视为有序对,在给定时它总是返回相同的值   一对值作为其两个参数,并且将ToNumber应用于此值的结果不是NaN;

console.log(Number(true))
console.log(Number(false))

答案 1 :(得分:0)

比较两个元素时,排序函数需要低于0,0或大于0的数字。

< 0 - 第一个元素具有优先权 = 0 - 两个元素具有相同的优先级 > 0 - 第二个元素具有优先级

因此a - b将返回正确的值范围,而a > b将仅返回01,导致排序中缺少比较结果,并且可能会对某些数据集产生负面结果