如何';s JavaScript';是否实现了本机排序功能?
让我们先看一个例子如何';s JavaScript';是否实现了本机排序功能?,javascript,sorting,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(“红色”),Number(“200美元”)和Numb
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(“红色”)
,Number(“200美元”)
和Number(“白色”)
在比较时都给出了NaN
为什么4
在结果的第一个位置?我想这与Array.prototype.sort
的实现有关,那么如何才能看到它的实现呢?规范
根据,
如果comparefn不是未定义的,并且不是此数组元素的一致比较函数(见下文),则排序行为是实现定义的
[……]
如果集合S中的所有值A、b和c(可能是相同的值)满足以下所有要求,则函数comparefn是一组值S的一致比较函数[…]
- 当给定一对特定的值a和b作为其两个参数时,调用comparefn(a,b)总是返回相同的值v。此外,类型(v)是数字,,而v不是NaN。[……]
实际上 Google Chrome和NodeJS(V8引擎)以及Opera(Futhark/Carakan)返回: Firefox(SpiderMonkey)返回: Internet Explorer返回:
["Red", "$200", false, 0.3, true, 4, "white", 7.4, 12]
它通常是本机代码,所以我想每个实现都会有所不同。可能应该检查spec.FWIW,ES5说指定的比较函数是因为它不是“一致的比较函数”。
[false, 0.3, true, 4, "Red", "$200", "white", 7.4, 12]
["Red", "$200", false, 0.3, true, 4, "white", 7.4, 12]