让我们先看一个例子。
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
的实现有关,所以我怎样才能看到它的实现?
答案 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]