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

Ovi*_*lia 7 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]
Run Code Online (Sandbox Code Playgroud)

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

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

azz*_*azz 6

规格

根据ECMAScript 5 - 第15.4.4.11节,

如果comparefn不是未定义和不是该阵列(见下文)中的元素一致的比较函数,排序行为是实现定义.

[...]

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

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

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


在实践中

谷歌Chrome和NodeJS(V8引擎),以及Opera(Futhark/Carakan)返回:

[4, "Red", "$200", "white", false, 0.3, true, 7.4, 12]
Run Code Online (Sandbox Code Playgroud)

Firefox(SpiderMonkey)返回:

[false, 0.3, true, 4, "Red", "$200", "white", 7.4, 12]
Run Code Online (Sandbox Code Playgroud)

Internet Explorer返回:

["Red", "$200", false, 0.3, true, 4, "white", 7.4, 12]
Run Code Online (Sandbox Code Playgroud)