[20, 3, 10].sort()

原创 2016年08月03日 11:00:24

前段时间看到有人在网上说javascript烂,原因之一是下面这个例子。
[20, 3, 10].sort();
// [10, 20, 3]
这样的结果看上去确实难以理解,说得好听是违反直觉,难听则是错得不可理喻,这门语言怎么会在这么简单的地方犯这么低级的错误。然而,虽然javascript设计上有一些缺陷,在这个行为上却不能背黑锅。一切都是有原因的。
我们知道javascript是一门动态类型的语言,换句话说在编译时不会对变量的类型做检查(作为一门在大多数环境下解释运行的脚本语言,也没有编译这样的机会。),换句话说变量没有和类型绑定(声明变量的时候不像静态类型语言那样String msg、Date now,而是用统一的var msg、var now),和这样的理念相一致的自然是,作为容器的数组对其中的元素的数据类型没有任何限制。
var elem=[1, ‘sit’, new Date()];
有了这个前提,我们再来看数组的排序。任何排序都要基于一定的标准,例如数字可以按照它们的大小,字符可以根据某种编码,对象可以根据它们的某种属性或者字符串形式。总之,对于某个需要排序的集合,需要在它们的元素间定义一个函数compare(a, b),当任意两个元素作为参数时,函数将依据大于、等于、小于三种情况,得出确定的结果。
对javascript中的数组排序,当没有给sort方法传入比较函数时,javascript的默认算法必须能够处理数组元素的数据类型任意的各种情况。而对所有数据类型都有效的排序标准,或者说所有数据类型都能转换成的可以进行比较的数据类型,就是字符串形式。所以javascript数组sort方法的第一步就是将其中的元素转换成字符串形式。
[20, 3, 10].sort();
// 相当于[‘20’, ‘3’, ‘10’].sort(),结果自然是[10, 20, 3]。
那么要将它们视作数字排序怎么办?很简单,只要给sort方法传入一个比较函数compare(a, b)。当a大于b时,返回一个固定的正值;a等于b时,返回0;a小于b时,返回一个固定的负数。一个既简单又容易想到的函数就是:
function compareNumbers(a, b) {
return a - b;
}
这样,我们只要:
[20, 3, 10].sort(compareNumbers);
// [3, 10, 20]
或者更简单地写作:
[20, 3, 10].sort(function (a, b) {
return a - b;
});
或者更更简单地写作(需要在支持ECMAScript6的环境下):
[20, 3, 10].sort((a, b) => a-b);
一定要使用比较函数吗?或者说数组一定要支持任意类型的元素吗?在ECMAScript6中,答案也是不一定的。ECMAScript6新增了固定元素数据类型的数组TypedArray,数据类型可以是各种取值范围和精度等级的数字,从Int8Array到Float64Array。使用这些数组,我们就可以理所当然地将元素视为数字排序:
var a=new Int32Array([20, 3, 10]);
a.sort();
// [3, 10, 20]

剑指offer--简易动态规划(3、10、20、26,61)

动态规划的思想是在前一步的信息已经保存好,下一步在之前保存信息的基础上做下一步计算。 offer3 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数...

win10写的程序在win7下面崩溃的问题 CLR20r3 MissingMethodException

win10写好的程序安装到win7,运行一会就崩溃了。程序已经对异常进行处理,并没有catch里面throw未处理的代码。 但程序就是不提示异常,直接崩溃。 问题签名为:  问题签名:  ...

启动3个线程,线程1打印1到5,线程2打印5到10,线程3打印11到15,然后线程1打印16到20,以此类推。。。打印到30为止

//启动3个线程,线程1打印1到5,线程2打印5到10,线程3打印11到15,然后线程1打印16到20,以此类推。。。打印到30为止 public class MainThread { pri...
  • wym1581
  • wym1581
  • 2017年04月15日 17:59
  • 651

Oracle Database 10g:为数据库管理员提供的 20 个最重要的特性 - 3.改善的表空间管理

表空间管理得到了重大的改进,这可以归因于一个 sparser SYSTEM、为用户定义一个默认表空间的支持、新的 SYSAUX、甚至重命名 您曾经多少次因用户在 SYSTEM 表空间中创建了非 SYS...

10-排序6 Sort with Swap(0, i) (25分)

表排序的典型题目。 分析: /* 假设每个环的元素个数分别为m1, m2, ...  * 其中,单一元素的环说明了该元素在正确的位置上,不考虑。多元素的环,所有元素都不在正确的位置上。 ...
  • Van0512
  • Van0512
  • 2016年11月10日 23:08
  • 389

10-排序6 Sort with Swap(0, i)

题目 10-排序6 Sort with Swap(0, i) (25分) 分析 我刚开始想着直接排序。先试了几个例子,经过总结之后,觉得步骤应该是这样: 看0在不在位置0处(即得到0所在的位...

【Educational Codeforces Round 10B】【简单脑洞】z-sort 数列重排 奇小偶大

B. z-sort time limit per test 1 second memory limit per test 256 megabytes input s...

A10/A20 Bootloader加载过程分析

A10/A20 Bootloader加载过程分析 注:由于全志A10和A20在加载Bootloader过程方面基本一致,下面仅以A20叙述,但同时也适用于A10。另外在不需要区分Cubieboa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[20, 3, 10].sort()
举报原因:
原因补充:

(最多只允许输入30个字)