sort函数的工作原理是什么
1. sort()函数的基本用法
sort()函数是JavaScript Array对象中一种常用的排序函数,它的作用是将数组中的元素按照指定的方式进行排序。sort()函数的基本用法如下:
let arr = [1, 5, 2, 9, 4]; arr.sort(); //默认按字符串 Unicode 顺序排序 console.log(arr); // [1, 2, 4, 5, 9]
在上面的示例中,我们声明了一个包含5个整数的数组,然后调用了sort()函数对数组进行排序。由于我们没有指定排序方式,所以sort()函数默认会按照从小到大的顺序对数组进行排序。由于sort()函数会改变原始数组,所以排序后的数组可以直接输出。
2. sort()函数的排序规则
除了默认排序方式(字符串 Unicode 顺序)之外,sort()函数还可以接收一个排序规则函数作为参数,用来指定排序的方式。排序规则函数应该返回一个负数、零、或正数,表示待排比较的两个元素的大小关系。
let arr = [1, 5, 2, 9, 4]; arr.sort(function (a, b) { return a - b; //按升序排列 }); console.log(arr); // [1, 2, 4, 5, 9]
在上面的示例中,我们使用一个匿名函数作为sort()函数的参数,这个函数会将待排比较的两个元素相减,如果结果为负数,则表示第一个元素应该排在第二个元素之前,如果结果为正数,则表示第一个元素应该排在第二个元素之后。由于我们指定了排序规则,所以此时sort()函数会按照我们指定的升序方式对数组进行排序。
3. sort()函数的稳定性
sort()函数的稳定性指的是排序前后相等元素的相对位置是否发生改变。通常来说,一个排序函数如果可以保证排序前后相等元素的相对位置不变,则该函数被称为稳定的排序函数。与此相对的,如果排序前后相等元素的相对位置发生了变化,则该函数被称为不稳定的排序函数。
let arr = [{name:'Bob', age: 18}, {name:'Alice', age: 20}, {name:'Bob', age: 22}]; arr.sort(function (a, b) { return a.name.localeCompare(b.name); //按名字升序排列 }); console.log(arr); // [{name:'Alice', age: 20}, {name:'Bob', age: 18}, {name:'Bob', age: 22}]
在上面的示例中,我们定义了一个包含3个对象元素的数组,其中每个对象都包含name和age两个属性。由于sort()函数只能对基本类型进行排序,所以在对对象数组进行排序时,我们需要使用一个比较函数来指定排序规则。在这个例子中,我们使用了localeCompare()函数来比较两个对象的name属性,这个函数可以确保排序前后相等元素的相对位置不变。
4. sort()函数的局限性
虽然sort()函数可以满足大多数排序需求,但是在某些特定情况下,sort()函数会出现不可预期的行为。这主要是因为sort()函数会对原始数组进行修改,而且比较函数的实现也比较复杂,容易出错。下面是一个sort()函数的局限性实例:
let arr = [3, 15, 8, 21, 45]; arr.sort(); console.log(arr); // [15, 21, 3, 45, 8]
在上面的示例中,我们声明了一个包含5个整数的数组,然后调用了sort()函数对数组进行排序。由于我们没有指定排序规则,所以sort()函数默认会按照从小到大的顺序对数组进行排序。但是,由于sort()函数比较两个元素时会将它们转换成字符串进行比较,所以在比较3和15、21和3、45和8时,实际比较的是"3"和"15"、"21"和"3"、"45"和"8",而不是它们的数值大小。由于字符串"15"比"3"大,所以被认为是15比3要大。同样的,45比8也比3大,所以按照这种逻辑排序后得到的结果与我们的预期不同。