202 Lotus blogs updated hourly. Who will post next? Home | Blogs | Search | About 
 
Latest 7 Posts
[原]AlphaGo落幕了,围棋还将继续
Thu, Jun 1st 2017 5
[原]《马丁伊登》
Tue, Jan 31st 2017 7
[原]71. 从Lotus Notes表单到XPage——兼谈程序里的二进制文件和文本文件
Mon, Aug 15th 2016 9
[原][20, 3, 10].sort()
Tue, Aug 2nd 2016 6
[原]JavaScript单元测试
Fri, Jul 15th 2016 10
[原]用JavaScript编写业务逻辑?
Wed, Jul 13th 2016 9
[原]《罗辑思维不逻辑》之那些温柔的操纵
Thu, Jun 23rd 2016 10
Top 10
[原]84. 从视图索引说Notes数据库(下)
Sat, Nov 1st 2014 13
[原]七、股票是什么?
Thu, Oct 15th 2015 10
[原]《罗辑思维不逻辑》之那些温柔的操纵
Thu, Jun 23rd 2016 10
[原]JavaScript单元测试
Fri, Jul 15th 2016 10
[原]91. 基于Notes/Domino的文档工作流系统(三)
Tue, Jan 13th 2015 9
[原]风险和收益成正比
Sat, Oct 10th 2015 9
[原]用JavaScript编写业务逻辑?
Wed, Jul 13th 2016 9
[原]71. 从Lotus Notes表单到XPage——兼谈程序里的二进制文件和文本文件
Mon, Aug 15th 2016 9
[原]90. 基于Notes/Domino的文档工作流系统(二)
Fri, Jan 9th 2015 8
[原]股市带动书市
Sat, Oct 10th 2015 8


[原][20, 3, 10].sort()
Twitter Google+ Facebook LinkedIn Addthis Email Gmail Flipboard Reddit Tumblr WhatsApp StumbleUpon Yammer Evernote Delicious
   

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

作者:starrow 发表于2016/8/3 11:00:24 原文链接
阅读:0 评论:0 查看评论


---------------------
http://blog.csdn.net/starrow/article/details/52101612
Aug 03, 2016
7 hits



Recent Blog Posts
5
[原]AlphaGo落幕了,围棋还将继续
Thu, Jun 1st 2017 9:41a   Pan Starrow
柯洁与AlphaGo的巅峰绝响落幕了,这无疑为近几年来很火的人工智能又添了一把柴。媒体上有很多文章分析AlphaGo所用的技术,但这次比赛对围棋的影响同样是十分深远的。 19岁的当今世界围棋第一人柯洁与重装上阵的AlphaGo之间的三番棋决战,再次将间歇性棋迷的我拉到电脑屏幕前,每一盘跟着对局双方不吃午饭地熬了几个小时。看到第三局开始不久柯洁脸上无奈和痛苦的表情
7
[原]《马丁伊登》
Tue, Jan 31st 2017 4:08p   Pan Starrow
看到微博上锵锵三人行最新一期节目的介绍时,我心中一惊,怎么会这么巧。刚看完杰克伦敦的马丁伊登,许子东就要谈这本他认为改变自己人生的书。马丁伊登不至于改变我的人生,但也是给我印象最深刻的小说之一。作家有两类。一类社会型的作家喜欢观察别人的生活,写别人的故事。一类自我型的作家擅长描写自己的见闻,抒发个人的感情。我个人偏好后者,并且偏见




Created and Maintained by Yancy Lent - About - Planet Lotus Blog - Advertising - Mobile Edition