如何实现JavaScript的本机排序功能?

时间:2013-11-02 05:35:53

标签: javascript sorting

让我们先看一个例子。

var everything = [4,'Red', '$200', 'white', 7.4, 12, true, 0.3, false];
console.log(everything.sort(function(a, b) {return a - b;})); 
// [4, "Red", "$200", "white", false, 0.3, true, 7.4, 12]

我认为这很奇怪,即使我知道Number("Red")Number("$200")Number("white")在比较时都给予NaN

为什么4位于结果的第一位?我想这与Array.prototype.sort的实现有关,所以我怎样才能看到它的实现?

1 个答案:

答案 0 :(得分:6)

规范

根据ECMAScript 5 - Section 15.4.4.11

  

如果 comparefn 不是未定义并且不是此数组元素的一致比较函数(见下文),则sort的行为是实现 - 定义即可。

     

[...]

     

如果集合S [...]中的所有值a,b和c(可能是相同的值)满足以下所有要求,则函数comparefn是一组值S的一致比较函数/ p>      

      
  • 当给定一对特定值a和b作为其两个参数时,调用comparefn(a,b)始终返回相同的值v。此外,Type(v)是Number,,v不是NaN 。 [...]
  •   

也就是说,如果比较函数的返回值是NaN,则对sort的调用行为是“实现定义的”。


在实践中

Google Chrome和NodeJS(V8引擎)以及Opera(Futhark / Carakan)的回归:

[4, "Red", "$200", "white", false, 0.3, true, 7.4, 12]

Firefox(SpiderMonkey)返回:

[false, 0.3, true, 4, "Red", "$200", "white", 7.4, 12]

Internet Explorer返回:

["Red", "$200", false, 0.3, true, 4, "white", 7.4, 12]