在JavaScript中,`Array.prototype.sort()` 方法用于对数组的元素进行排序,并返回排序后的数组。这个方法会就地(in-place)对数组进行排序,即直接修改原数组,而不是创建一个新的数组。
### 基本语法
arr.sort([compareFunction])
- `arr` 是需要排序的数组。
- `compareFunction`(可选)是一个比较函数,用于定义排序的顺序。如果省略,元素将按照转换为的字符串的Unicode位点进行排序。
### compareFunction
`compareFunction` 应该是一个函数,它接收两个参数 `a` 和 `b`,并返回一个用于指示这两个值的相对顺序的数字。
- 如果返回值小于 0,那么 `a` 会被排列到 `b` 之前。
- 如果返回值等于 0,`a` 和 `b` 的相对位置不变。
- 如果返回值大于 0,`b` 会被排列到 `a` 之前。
### 示例
#### 默认排序(字符串排序)
let fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
console.log(fruits); // 输出: ["Apple", "Banana", "Mango", "Orange"]
#### 数字排序
对于数字数组,由于默认排序会将数字转换为字符串进行比较,所以可能不是我们期望的结果。这时需要提供一个比较函数。
let numbers = [40, 100, 1, 5, 25];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers); // 输出: [1, 5, 25, 40, 100]
或者使用箭头函数:
numbers.sort((a, b) => a - b);
console.log(numbers); // 输出: [1, 5, 25, 40, 100]
#### 逆序排序
如果你想要数组按照降序排列,可以修改比较函数的返回值逻辑。
numbers.sort((a, b) => b - a);
console.log(numbers); // 输出: [100, 40, 25, 5, 1]
### 注意事项
- `sort()` 方法会直接修改原数组。
- 排序的时间复杂度依赖于具体实现,V8引擎(Chrome, Node.js等使用的JavaScript引擎)的Timsort算法平均情况下为O(n log n),但最坏情况下为O(n^2)。
- 对于包含`undefined`元素的数组,其排序行为可能不是直观的,因为`undefined`会被转换为字符串`"undefined"`进行比较。