Open NBR-hugh opened 8 years ago
hello 我在开智自我介绍那里知道了你(我也在准备做前端工程师),所以到你的 Github 来看看。
看一个例子你就明白了。
arr.sort(function(a, b) {
return a - b;
});
这里 sort() 是函数 B,作为它的参数的 function(a, b) 就是函数 A 这种用法的实际应用场景有: 因为用 sort() 进行排序时,是把元素转成 String 类型进行排序, 就会出现 [1, 11, 2, 3] 这样的情况,利用 sort() 可以接受一个函数作为参数的特性, 将参与比较的元素进行相减处理,这时则是根据函数的返回值进行排序。 你再回看这句话:
比较函数返回的是负值则a应该在b前,正值则b在a前,0则二者相等。
可能就比较好理解了。
@soyaine
恩,谢谢您的解释。 :-D
我原来的困惑是对sort排序功能如何实现的困惑,想着能不能写个具体的function把它表现出来,猜想应该是个根据a-b大于0,小于0,等于0三种情况对元素位置进行操作的函数,具体实现的话就有些烧脑了,想着刚刚开始学还是先把命令用熟练再去细究,就暂时放一边了,不过对您的回答有一个困惑:
我的理解不同的点操作性质对应的对象是不同的,sort的操作对象应该是array而不是string,您是如何得知
因为用 sort() 进行排序时,是把元素转成 String 类型进行排序
个人不是很理解转化的必要性,您是看过sort的具体实现代码么?
@NBR-hugh O(∩_∩)O~不用称呼您,我和你一样大四。
sort()
排序转化为字符形式,是在 Mozilla 文档里提及的:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
If compareFunction is not supplied, elements are sorted by converting them to strings and comparing strings in Unicode code point order.
若没有提供 sort()
中的方法参数,会转换为字符进行比较排序;若提供了,则是根据参数中的方法的返回值进行排序。
另外你提到的 sort()
实现的代码在这里:
https://github.com/v8/v8/blob/master/src/js/array.js
710 行开始是 sort()
的实现
用了快速排序(760 行)和插入排序(726 行),插入排序在数组元素数量小于等于 22 的时候使用。
但这只是 V8 引擎的实现,其他引擎可能内部实现机制不一样。
FCC中的解释:
主要是这一段:
sort 可以通过比较函数作为回调函数(callback),假如 比较函数返回的是负值则a应该在b前,正值则b在a前,0则二者相等。
ok,那么新的疑问,回调函数(callback)是什么?
知乎的高分回答:
sf上的回答 这个解释get到点: