用于compareFunction的sort方法背后的逻辑是什么?

时间:2014-11-09 12:39:51

标签: javascript sorting

我正在尝试使用comapreFunction的sort()方法,我不明白compareNumbers()的工作原理。与两个变量一起使用它返回-3,但是当在带有sort方法的数组上使用它时,它返回一个已排序的数组。为什么它会像这样工作?

var things = ['Elvis',555,'R2D2'];

function compareNumbers(a, b){
  return a-b;
}
var a = 5;
var b = 8;

console.log(compareNumbers(a,b)); //returns -3
console.log(compareNumbers(things));//returns NaN
console.log(things.sort(compareNumbers(a,b)));//returns a sorted array

compareFunction使用的sort方法背后的逻辑是什么,它返回一个有序数组? 为什么它不返回NaN?

我在哪里可以查看库或文档等方法背后的代码是什么?

我看到了这个Understanding sort() compareFunction,但在这个阶段我只是压倒性的。

2 个答案:

答案 0 :(得分:1)

compareNumbers(a,b)返回-3,因此您正在呼叫things.sort(-3)。由于-3不是函数,因此将忽略它​​,并使用默认排序算法。

答案 1 :(得分:1)

正在调用 compareNumbers并将其返回值传递给sort,这不是您想要的。您想将功能传递到sort,因此sort会将其调用:

console.log(things.sort(compareNumbers));
// No (), no a and b -----------------^

重要的是要注意,当ab"Elvis""R2D2"时,您的比较器功能({{1} })返回compareNumbers,这意味着根据the specification,它不是“一致的比较函数”。这意味着此时NaN所做的任何事情都是“实现定义” - 完全取决于JavaScript引擎的作者,完全不受规范的约束,并且可能因引擎而异。 sort预计会看到一个负数,sort或正数,而不是0。您的NaN数组根本不应按数字排序,因为它的两个条目不是数字,也不能正确转换为数字。

这是一个正确使用比较器函数的示例:在这种情况下,它接受您的数组并根据转换为字符串的每个条目的长度对它们进行排序:

things
var things = ['Elvis',555,'R2D2'];

function compareLengths(a, b){
  return String(a).length - String(b).length;
}

snippet.log(things.sort(compareLengths));