ECMAScript 6 数组扩展方法详解
本文详细解析 ECMAScript 6 中数组的扩展功能,涵盖展开运算符在函数调用与数组合并中的应用,Array.from 与 Array.of 对类数组对象的转换,以及 copyWithin、find、fill、includes 等实例方法的参数与行为,提供具体代码示例说明。
扩展运算符
扩展运算符(spread)由三个点(...)表示。它的作用类似于 rest 参数的逆运算,主要功能是将一个数组转换为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
该运算符主要用于函数调用场景。
function push(array, ...items) {
array.push(...items);
}
function add(x, y) {
return x + y;
}
const numbers = [4, 38];
add(...numbers) // 42
它可以替代函数的 apply 方法。由于扩展运算符具备展开数组的能力,因此不再需要通过 apply 方法将数组转换为函数的参数。
// ES5 的写法
function f(x, y, z) {
// ...
}
var args = [0, 1, 2];
f.apply(null, args);
// ES6的写法
function f(x, y, z) {
// ...
}
let args = [0, 1, 2];
f(...args);
以下是扩展运算符取代 apply 方法的一个实际示例,利用 Math.max 方法简化求取数组最大元素的写法。
// ES5 的写法
Math.max.apply(null, [14, 3, 77])
// ES6 的写法
Math.max(...[14, 3, 77])
// 等同于
Math.max(14, 3, 77);
扩展运算符还可用于数组合并,提供了一种新的合并数组写法。
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]
// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
Array.from()
Array.from 方法用于将两类对象转换为真正的数组:一类是类似数组的对象(array-like object),另一类是可遍历(iterable)的对象,包括 ES6 新增的数据结构 Set 和 Map。
下面展示了一个类似数组的对象,使用 Array.from 将其转换为真正的数组。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
在实际应用中,常见的类似数组对象包括 DOM 操作返回的 NodeList 集合,以及函数内部的 arguments 对象。Array.from 均可将它们转换为真正的数组。
Array.of()
Array.of 方法用于将一组值转换为数组。
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
该方法的主要目的是弥补数组构造函数 Array() 的不足。因为参数个数的不同,会导致 Array() 的行为存在差异。
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
数组实例的 copyWithin()
数组实例的 copyWithin() 方法用于在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),并返回当前数组。这意味着使用该方法会修改当前数组。
Array.prototype.copyWithin(target, start = 0, end = this.length)
它接受三个参数。
target(必需):指定从该位置开始替换数据。如果为负值,表示倒数计算。
start(可选):指定从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
end(可选):指定到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
这三个参数都应该是数值,如果不是,会自动转为数值。
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
数组实例的 find() 和 findIndex()
数组实例的 find 方法用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为 true 的成员,然后返回该成员。如果没有符合条件的成员,则返回 undefined。
[1, 4, -5, 10].find((n) => n < 0)
// -5
上面代码找出数组中第一个小于 0 的成员。
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
上面代码中,find 方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。
数组实例的 fill()
fill 方法使用给定值,填充一个数组。
['a', 'b', 'c'].fill(7)
// [7, 7, 7]
new Array(3).fill(7)
// [7, 7, 7]
数组实例的 includes()
Array.prototype.includes 方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的 includes 方法类似。ES2016 引入了该方法。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true以上就是 ECMAScript 6 数组的扩展实例详解的详细内容,更多关于 ECMAScript 6 数组扩展的资料请关注本站其它相关文章!
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
为什么JS中typeof []返回object:数组类型检测误区解析
2026-11-04 19:50:47
D3.js 新手入门:环境搭建与第一个条形图实现
2026-11-04 10:49:48
