扩展运算符(...)
它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
const arr = [ ...(1 > 0 ? [1] : []), 'b' ] // [1, 'b']
[ ...[], 1 ] // [1]
Math.max(...[14, 3, 45]) // 接受一个参数序列而不是数组
应用
- 合并数组
[1, 2, [3, 4]]
- 与解构赋值结合
const [first, ...rest] = [1,2,3]
// first 1
// rest [2,3]
- 处理字符串
[...'hello'] // ['h', 'e', 'l' , 'l', 'o']
'𠮷'.length // 2
[..."𠮷"].length // 1
Array.from()
用于将两类对象转为真正的数组:类似数组的对象(array-like-object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。 第一个参数是要处理的类似数组的对象,第二个参数是对每个元素处理的函数
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
const arr = Array.from(ArrayLike) // ['a','b','c']
DOM 操作返回的 NodeList 以及函数内部的 arguments 对象都是类似数组的对象,可以使用 Array.from()转换为数组
应用
Array.from({ length: 2 }, () => 'jack' ) // ['jack', 'jack']
Array.of()
将一组值转换为数组,替代 Array()或 new Array()
Array.of(1,2,3) // [1,2,3]
copyWithin
在当前数组内部将指定位置的成员复制到其他位置,覆盖原有成员。接受 3 个参数:
- target(必需):从该位置开始替换数据
- start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示倒数
- end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
find() 和 findIndex()
find()查找当前数组中第一个符合条件的数组成员,没有找到是返回 undefined。 findIndex()返回索引,没找到返回-1。它们的第一个参数是一个回调函数,回调函数有三个参数,以此为当前值当前位置,原数组。 第二个参数用来绑定回调函数的 this 对象。
fill()
使用给定值填充一个数组,数组中已有的值会被全部抹去。参数依次为要填充的值,起始位置,结束位置。
['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']
entries(), keys(), values()
ES6 提供三个新的方法—— entries() , keys() 和 values() ——用于遍历数组。它们都返回一个遍历器对象,可以 用 for...of 循环进行遍历,唯一的区别是 keys() 是对键名的遍历、 values() 是对键值的遍历, entries() 是对键值对的遍历。
for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
手动调用遍历器的 next()方法
let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']
includes() => boolean
返回一个布尔值表示是否包含给定值,第一个参数为查找元素,第二个为起始位置
数组空位
ES6 将空位转为 undefined
Array(3) // [, , ,]
filter(callback[, thisObject]) => any[]
参数:
- callback: 数组中每个元素都会执行的函数,有三个参数
- element:当前元素
- index:当前元素索引
- array:当前数组对象
- thisObject:回调函数内部的 this 对象
[1,2,3,4].filter(item => item > 2) // [3,4]
map(callback) => any[]
遍历每一个元素,返回新数组。 参数:
- callback: 数组中每个元素都会执行的函数,有三个参数
- element:当前元素
- index:当前元素索引
- array:当前数组对象
some(callback) => boolean
对每一个元素执行一次回调函数,直到此函数返回 true,some 将返回 true,如果每个元素执行后都返回 false,some 将返回 false 参数:
- callback: 数组中每个元素都会执行的函数,有三个参数
- element:当前元素
- index:当前元素索引
- array:当前数组对象
[1,2,3,4].some(item => item >=3) // true
[1,2,3,4].some(item => item >=5) // false
every(callback) => boolean
对每一个元素执行一次回调函数,直到此函数返回 false,every 将返回 false,如果每个元素执行后都返回 true,every 将返回 false 参数:
- callback: 数组中每个元素都会执行的函数,有三个参数
- element:当前元素
- index:当前元素索引
- array:当前数组对象
[1,2,3,4].every(item => item >=3) // false
[1,2,3,4].every(item => item >=1) // true
flat(number) => any[]
按照指定的深度(number)递归遍历数组,返回新数组
[1, 2, [3, 4, [5, 6]]].flat() // [1, 2, 3, 4, [5, 6]]
[1, 2, [3, 4, [5, 6]]].flat(2) // [1, 2, 3, 4, 5, 6]
flatMap()
[1, 2, 3, 4].flatMap(item => [item * 2]) // [2, 4, 6, 8]
[1, 2, 3, 4].flatMap(item => [[item * 2]]) // [[2], [4], [6], [8]]