7

我们先来看一个例子。

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,那么我怎样才能看到它的实现呢?

4

1 回答 1

7

规格

根据ECMAScript 5 - 第 15.4.4.11 节

如果comparefn不是undefined并且不是这个数组元素的一致比较函数(见下文),则 sort 的行为是实现定义的

[...]

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

  • 当给定一对特定的值 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]
于 2013-11-02T05:49:07.607 回答