ES6(ECMAScript 2015)为数组引入了许多新方法,这些方法极大地增强了数组的操作能力,使 JavaScript 更适合构建大型应用程序。以下是 ES6 中新增的一些主要数组方法及其功能说明:
### `Array.from()`
此方法用于从类数组对象或可迭代对象创建一个新的数组实例。它还可以接受一个映射函数作为第二个参数,用于在创建数组时对每个元素进行处理。例如:
```javascript
const arrayLike = { 0: 'a', 1: 'b', length: 2 };
const arr = Array.from(arrayLike);
console.log(arr); // 输出: ['a', 'b']
```
此外,`Array.from()` 会将数组的空位转为 `undefined`,这与 ES6 中其他处理空位的方法一致,如 `Array.from`、扩展运算符、`copyWithin()`、`fill()`、`entries()`、`keys()`、`values()`、`find()` 和 `findIndex()` 等方法的行为一致 [^4]。
### `Array.of()`
`Array.of()` 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。例如:
```javascript
const arr1 = Array.of(1, 2, 3);
console.log(arr1); // 输出: [1, 2, 3]
const arr2 = Array.of(7);
console.log(arr2); // 输出: [7]
```
此方法与 `new Array()` 不同,当传入单个数字时,`Array.of(7)` 会创建一个包含单个元素 `7` 的数组,而 `new Array(7)` 则会创建一个长度为 7 但元素为空的数组 [^2]。
### `Array.prototype.find()`
`find()` 方法返回数组中满足提供的测试函数的第一个元素的值。如果没有找到符合条件的元素,则返回 `undefined`。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
const found = numbers.find(num => num > 3);
console.log(found); // 输出: 4
```
此方法特别适用于需要查找数组中特定条件下的第一个匹配项的情况 [^2]。
### `Array.prototype.findIndex()`
`findIndex()` 方法与 `find()` 类似,但它返回的是满足条件的元素的索引,而不是元素本身。如果未找到符合条件的元素,则返回 `-1`。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
const index = numbers.findIndex(num => num > 3);
console.log(index); // 输出: 3
```
### `Array.prototype.fill()`
`fill()` 方法用于填充数组中的所有元素,从起始索引到结束索引(不包括结束索引)。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
arr.fill(0, 1, 4);
console.log(arr); // 输出: [1, 0, 0, 0, 5]
```
此方法可以用于快速初始化数组或重置数组的某些部分 [^4]。
### `Array.prototype.copyWithin()`
`copyWithin()` 方法用于在同一数组内部复制数组元素,从目标位置开始替换。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
arr.copyWithin(0, 3);
console.log(arr); // 输出: [4, 5, 3, 4, 5]
```
此方法允许在同一数组内高效地移动数据 [^4]。
### `Array.prototype.entries()`, `keys()`, 和 `values()`
这些方法分别返回一个新的迭代器对象,该对象包含数组的键值对、键或值。它们主要用于支持 `for...of` 循环等现代迭代机制。例如:
```javascript
const arr = ['a', 'b', 'c'];
const entries = arr.entries();
console.log([...entries]); // 输出: [[0, 'a'], [1, 'b'], [2, 'c']]
```
这些方法使得数组更易于与其他可迭代对象一起使用 [^4]。
### `Array.prototype.includes()`
`includes()` 方法用于判断数组是否包含指定的元素,返回一个布尔值。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
console.log(arr.includes(3)); // 输出: true
console.log(arr.includes(6)); // 输出: false
```
此方法提供了一种简洁的方式来检查数组中是否存在某个值 [^3]。
### `Array.prototype.map()`
`map()` 方法创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
const squared = numbers.map(num => num * num);
console.log(squared); // 输出: [1, 4, 9, 16, 25]
```
此方法非常适合对数组中的每个元素进行转换或处理 [^1]。
### `Array.prototype.filter()`
`filter()` 方法创建一个新数组,包含所有通过测试函数的元素。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
const even = numbers.filter(num => num % 2 === 0);
console.log(even); // 输出: [2, 4]
```
此方法非常适合从数组中筛选出符合特定条件的元素 。
### `Array.prototype.reduce()` 和 `reduceRight()`
`reduce()` 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序),将其结果汇总为单个输出值。`reduceRight()` 则是从右到左执行。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 输出: 15
```
此方法非常适合用于聚合操作,如求和、计数等 [^3]。
### `Array.prototype.some()` 和 `every()`
`some()` 方法测试数组中是否有至少一个元素通过了提供的测试函数,返回一个布尔值。`every()` 方法则测试数组中的所有元素是否都通过了测试函数。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
console.log(numbers.some(num => num > 3)); // 输出: true
console.log(numbers.every(num => num > 0)); // 输出: true
```
这些方法非常适合用于逻辑判断和验证 [^3]。
### `Array.prototype.forEach()`
`forEach()` 方法对数组中的每个元素执行一次提供的函数。此方法没有返回值。例如:
```javascript
const numbers = [1, 2, 3, 4, 5];
numbers.forEach(num => console.log(num));
// 输出: 1, 2, 3, 4, 5
```
此方法非常适合用于遍历数组并执行副作用操作 [^3]。
### `Array.prototype.indexOf()` 和 `lastIndexOf()`
`indexOf()` 方法返回数组中第一个匹配指定值的元素的索引,如果没有找到则返回 `-1`。`lastIndexOf()` 则是从后向前查找。例如:
```javascript
const arr = [1, 2, 3, 2, 1];
console.log(arr.indexOf(2)); // 输出: 1
console.log(arr.lastIndexOf(2)); // 输出: 3
```
这些方法非常适合用于查找数组中元素的位置 。
### `Array.prototype.join()`
`join()` 方法将数组的所有元素连接成一个字符串,并返回这个字符串。例如:
```javascript
const arr = ['apple', 'banana', 'cherry'];
const str = arr.join(', ');
console.log(str); // 输出: "apple, banana, cherry"
```
此方法非常适合用于生成字符串表示形式 。
### `Array.prototype.slice()`
`slice()` 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括 end)。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
const subArr = arr.slice(1, 4);
console.log(subArr); // 输出: [2, 3, 4]
```
此方法非常适合用于提取数组的子集 。
### `Array.prototype.splice()`
`splice()` 方法可以用来修改数组的内容,删除或添加元素。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
arr.splice(2, 1, 'a', 'b');
console.log(arr); // 输出: [1, 2, 'a', 'b', 4, 5]
```
此方法非常适合用于动态修改数组内容 [^3]。
### `Array.prototype.sort()`
`sort()` 方法用于对数组的元素进行排序。默认情况下,排序是基于字符串 Unicode 码点进行的。例如:
```javascript
const arr = [3, 1, 4, 2, 5];
arr.sort();
console.log(arr); // 输出: [1, 2, 3, 4, 5]
```
此方法非常适合用于对数组进行排序 。
### `Array.prototype.reverse()`
`reverse()` 方法用于颠倒数组中元素的顺序。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
arr.reverse();
console.log(arr); // 输出: [5, 4, 3, 2, 1]
```
此方法非常适合用于反转数组顺序 。
### `Array.prototype.toString()`
`toString()` 方法返回一个字符串,表示指定的数组及其元素。例如:
```javascript
const arr = [1, 2, 3];
const str = arr.toString();
console.log(str); // 输出: "1,2,3"
```
此方法非常适合用于生成数组的字符串表示 [^3]。
### `Array.prototype.toLocaleString()`
`toLocaleString()` 方法返回一个字符串,表示数组中的元素。此方法会根据本地化设置格式化元素。例如:
```javascript
const arr = [1, 2, 3];
const str = arr.toLocaleString();
console.log(str); // 输出: "1,2,3" (根据本地化设置可能不同)
```
此方法非常适合用于生成本地化的字符串表示 [^3]。
### `Array.prototype.push()`, `pop()`, `shift()`, 和 `unshift()`
这些方法分别用于向数组末尾添加元素、从数组末尾移除元素、从数组开头移除元素、向数组开头添加元素。例如:
```javascript
const arr = [1, 2, 3];
arr.push(4);
console.log(arr); // 输出: [1, 2, 3, 4]
arr.pop();
console.log(arr); // 输出: [1, 2, 3]
arr.shift();
console.log(arr); // 输出: [2, 3]
arr.unshift(1);
console.log(arr); // 输出: [1, 2, 3]
```
这些方法非常适合用于动态修改数组内容 [^3]。
### `Array.prototype.concat()`
`concat()` 方法用于合并两个或多个数组。此方法不会修改现有数组,而是返回一个新数组。例如:
```javascript
const arr1 = [1, 2];
const arr2 = [3, 4];
const combined = arr1.concat(arr2);
console.log(combined); // 输出: [1, 2, 3, 4]
```
此方法非常适合用于合并数组 。
### `Array.prototype.flat()` 和 `flatMap()`
`flat()` 方法用于递归展开数组中的嵌套数组。`flatMap()` 则是先映射每个元素,然后展开结果。例如:
```javascript
const arr = [1, [2, [3, 4], 5]];
const flattened = arr.flat();
console.log(flattened); // 输出: [1, 2, 3, 4, 5]
```
这些方法非常适合用于处理嵌套数组 。
### `Array.prototype.flatMap()`
`flatMap()` 方法首先使用映射函数映射每个元素,然后将结果展平一层。例如:
```javascript
const arr = [1, 2, 3];
const result = arr.flatMap(x => [x, x * 2]);
console.log(result); // 输出: [1, 2, 2, 4, 3, 6]
```
此方法非常适合用于同时进行映射和展平操作 [^3]。
### `Array.prototype.at()`
`at()` 方法返回数组中指定索引位置的元素。支持负数索引,表示从数组末尾开始计数。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
console.log(arr.at(2)); // 输出: 3
console.log(arr.at(-1)); // 输出: 5
```
此方法非常适合用于访问数组中的特定元素 [^3]。
### `Array.prototype.with()`
`with()` 方法返回一个新的数组副本,其中指定索引位置的元素被替换为新的值。例如:
```javascript
const arr = [1, 2, 3, 4, 5];
const newArr = arr.with(2, 'a');
console.log(newArr); // 输出: [1, 2, 'a', 4, 5]
```
此方法非常适合用于创建数组的不可变更新 。
###