扩展运算符
- 好比
rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
console.log(1, ...[2, 3, 4], 5)
function add(x, y) {
return x + y;
}
const numbers = [4, 38];
add(...numbers)
- 只有函数调用时作为参数,扩展运算符才可以放在圆括号中,否则报错。
(...[1, 2])
console.log((...[1, 2]))
console.log(...[1, 2])
- 如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
const [...butLast, last] = [1, 2, 3, 4, 5];
const [first, ...butLast] = [1, 2, 3, 4, 5];
first
butLast
替代函数的apply()
function f(x, y, z) {}
var args = [0, 1, 2];
f.apply(null, args);
f(...args);
let arr = [1,2,3,4,5];
Math.max.apply(null, arr);
Math.max(...arr);
复制数组
let arr = [1,2,3];
let arr2;
arr2 = arr.concat();
arr2 = [...arr];
合并数组
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];
const arr4 = arr.concat(arr2, arr3)
const arr4 = [...arr1, ...arr2, ...arr3];
与解构赋值结合
let list = [1,2,3,4,5];
let a = list[0];
let b = list.slice(1);
let [a, ...rest] = list;
字符串转数组
[...'hello']
'z\uD83D\uDE80z'.length
[...'z\uD83D\uDE80z'].length
实现Iterator接口
- 只要实现了
Iterator接口的对象,都可以使用扩展运算符转为数组。
let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
静态方法
Array.from()
- 将
类数组和实现了Iterator接口对象转为真正的数组。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
let arr2 = Array.from(arrayLike);
- 第二个参数作用类似于数组的
map()方法,用来对每个元素进行处理。
Array.from([1, 2, 3], (x) => x * x)
Array.of()
Array.of(3, 11, 8)
实例方法
copyWithin()
- 在当前数组内部,将指定位置的成员复制到其他位置(覆盖原成员),然后返回当前数组(
修改原数组)。
- 参数一(必需):从该位置开始替换数据。如果为负值,表示倒数。
- 参数二(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
- 参数三(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
[1, 2, 3, 4, 5].copyWithin(0, 3)
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
find()
- 用于找出第一个符合条件的数组成员。参数为一个回调函数,所有成员依次执行,知道找出第一个返回值为
true的成员,然后返回该成员。未找到返回undefined。
[1, 5, 10, 15].find((value, index, arr) => {
return value > 9;
})
findIndex()
- 与
find几乎一致,区别是此方法返回第一个符合条件的成员的下标,未找到返回-1。
findLast()
[1,2,3,4,5].findLast(item => item > 1)
findLastIndex()
- 与
findIndex几乎一致,区别是此方法从后往前查找。
[1,2,3,4,5].findLastIndex(item => item > 1)
fill()
- 使用给定值填充一个数组。参数二和参数三表示填充的起始位置和结束位置。
['a', 'b', 'c'].fill(7, 1, 2)
entries()
- 用于遍历数组的
键值对,返回一个遍历器对象。可以用for of循环。如果不使用for of,可以使用遍历器的next()进行遍历。
let entries = ['bob', 'jay', 'kitty'].entries()
for(let entry of entries){
console.log(entry)
}
keys()
- 用于遍历数组的
键名,返回一个遍历器对象。可以用for of循环。如果不使用for of,可以使用遍历器的next()进行遍历。
let keys = ['bob', 'jay', 'kitty'].keys()
for(let key of keys){
console.log(key)
}
values()
- 用于遍历数组的
键值,返回一个遍历器对象。可以用for of循环。如果不使用for of,可以使用遍历器的next()进行遍历。
let values = ['bob', 'jay', 'kitty'].values()
for(let value of values){
console.log(value)
}
includes()
[1, 2, 3].includes(2)
[1, 2, NaN].includes(NaN)
[1, 2, NaN].indexOf(NaN)
flat()
- 用于将嵌套的数组拉平,变成一维数组。返回一个新数组。默认只会拉平一层。参数表示需要拉平的层数。
[1,2,3, [1,2]].flat()
[1,2,3, [1,[2]]].flat(2)
[1, [2, [3]]].flat(Infinity)
flatMap()
- 对原数组的每个成员执行一个函数(相当于
map()),然后对返回值组成的数组执行flat()方法。返回一个新数组。只能展开一层。
[2, 3, 4].flatMap((x) => [x, x * 2])
at()
- 接受一个整数作为参数,返回对应位置的成员,并支持负索引。此方法也可用于字符串和类数组
const arr = [5, 12, 8, 130, 44];
arr.at(2)
arr.at(-2)