sort方法

sort方法用来对数组元素进行排序。但是浏览器实现可能有不同,已经两次踩到坑了,因此记录一下。

规范

ecma-262制定的排序规则:
使用两个参数x和y唤起排序

1、如果x、y都是undefined,返回 +0
2、如果x为undefined,返回 1
3、如果y未undefined,返回 -1
4、如果定义了排序方法

a、设v = ToNumber(comparefn(x, y))
b、如果v是NaN,返回 +0
c、返回v 

5、设xString = ToString(x)
6、设yString = ToString(y)
7、如果xString < yString,返回 -1
8、如果yString < xString,返回 1
9、返回 +0
当返回1的时候,x应排在y后面
返回0的时候,x、y位置不变
返回-1的时候,x应排在y前面

坑1:排序不一定是稳定的,即相等的两个元素不一定会保持在原来的位置。排序方法返回0的两个元素仍可能交换位置,如chrome浏览器的排序实现,在数组长度小于等于10的时候就使用插入排序法,没有什么问题,但是数组大于10的时候就会使用快速排序,在比较起始值和中值的时候,排序方法返回值大于和等于0的时候都会对调位置。

坑2:如上面排序规则第4条a,按标准需要把排序方法返回值转为Number类型,但是有些浏览器版本如Safari10并没有实现这一步,如果排序方法返回true/false布尔值而不是Number类型,元素位置就不会进行调整。

every方法

every方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。结果会返回一个布尔值,直觉认为空数组会返回false

callbackfn should be a function that accepts three arguments and
returns a value that is coercible to the Boolean value true or false.
every calls callbackfn once for each element present in the array, in
ascending order, until it finds one where callbackfn returns false. If
such an element is found, every immediately returns false. Otherwise,
if callbackfn returned true for all elements, every will return true.
callbackfn is called only for elements of the array which actually
exist; it is not called for missing elements of the array

如规范解释,every方法对数组中的每一个元素(排除空元素)通过指定的函数进行检测,当有某一个元素检测为false的时候,every方法立刻返回false,也只有这种情况会返回false,那么空数组就会返回true!


cindy
39 声望1 粉丝