[20, 3, 10].sort()

前段时间看到有人在网上说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]

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Linux中相关命令的例子: 1. grep:查找文本中的特定模式,如查找包含关键字“hello”的行。例:`grep "hello" file.txt` 2. sed:用于文本替换和编辑,如将文本文件中的字符串“foo”替换为“bar”。例:`sed 's/foo/bar/g' file.txt` 3. sort:按照字典顺序对文本文件进行排序。例:`sort file.txt` 4. tr:用于替换或删除文本中的字符,如将文本中的所有小写字母转换为大写字母。例:`tr 'a-z' 'A-Z' < file.txt` 5. uniq:用于删除文本文件中的重复行。例:`uniq file.txt` 6. wc:用于计算文件中的字数、行数和字符数。例:`wc file.txt` 7. dd:用于复制和转换文件。例:`dd if=/dev/zero of=file.txt bs=1M count=10`(将创建一个大小为10MB的文件) 8. ip link:用于管理网络接口。例:`ip link show` 9. ip addr:用于管理IP地址。例:`ip addr show` 10. ss:用于查看网络连接状态。例:`ss -tunlp` 11. netconfig:用于配置网络设置。例:`netconfig` 12. ifconfig:用于配置网络接口。例:`ifconfig eth0 up` 13. netstat:用于查看网络连接状态。例:`netstat -an` 14. ping:用于测试主机之间的连通性。例:`ping google.com` 15. useradd:用于创建新用户。例:`useradd john` 16. date:用于显示和设置系统日期和时间。例:`date` 17. kill:用于终止进程。例:`kill 1234` 18. logname:用于显示当前用户的登录名。例:`logname` 19. ps:用于显示当前正在运行的进程。例:`ps aux` 20. nice:用于调整进程的优先级。例:`nice -10 command` 21. top:用于实时监视系统资源使用情况。例:`top` 22. pstree:用于显示进程树。例:`pstree` 23. sudo:用于以超级用户权限运行命令。例:`sudo command` 24. uname:用于显示系统信息。例:`uname -a` 25. userdel:用于删除用户。例:`userdel john` 26. who:用于显示当前登录用户。例:`who` 27. whoami:用于显示当前用户的用户名。例:`whoami` 28. whois:用于查询域名信息。例:`whois google.com` 29. free:用于显示系统内存使用情况。例:`free`

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值