一、扩展运算符(…[ ])的应用
1.转成参数序列
2.复制数组
const a1 = [1, 2];
const a2 = a1.concat(); //es5
const a3 = [...a1]; //es6
const [...a4] = a1;
3.合并数组 [...arr1, ...arr2, ...arr3]
(浅拷贝)
4.解构赋值 const [first, ...rest] = [1, 2, 3, 4, 5]
5.正确返回字符长度 [...str].length
'x\uD83D\uDE80y'.length // 4
[...'x\uD83D\uDE80y'].length // 3
6.实现 Iterator 接口的对象
任何 Iterator
接口的对象,都可以用扩展运算符转为真正的数组。
对于那些没有部署Iterator
接口的类似数组的对象,使用 Array.from(arrayLike)
,实际上任何有length属性的对象,都可以通过Array.from
方法转为数组。
二、Array.from()
1.用于将两类对象转为真正的数组:类似数组的对象和可遍历的对象(包括 ES6 新增的数据结构 Set
和 Map
)。
2.Array.from
还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
三、Array.of()
用于将一组值,转换为数组。这个方法的主要目的,是弥补数组构造函数Array()
的不足。因为参数个数的不同,会导致Array()
的行为有差异。
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
Array.of
总是返回参数值组成的数组。如果没有参数,就返回一个空数组。
四、数组实例的 copyWithin()
将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。
Array.prototype.copyWithin(target, start = 0, end = this.length)
五、数组实例的 fill()
1.可用于填充数组,数组中已有的元素,会被全部抹去。
2.fill()
方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
['a', 'b', 'c', 'd'].fill(7, 1, 3)
// ['a', 7, 7, 'd']
// 注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。
let arr = new Array(3).fill([]);
arr[0].push(5);
// arr = [[5], [5], [5]]
六、数组实例的 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);
}1
// 0 "a"
// 1 "b"
七、数组实例的 includes()
表示某个数组是否包含给定的值(第二个参数表示搜索的起始位置),与字符串的includes()
方法类似。
[1, 2, 3].includes(3, 3) // false
[1, 2, 3].includes(3, -1) // true
[1, 2, [3]].includes([3]) // false
[NaN].includes(NaN) // true
八、数组实例的 flat(),flatMap()
1.flat()
用于将嵌套的数组“拉平”,变成一维的数组。参数:想要拉平的层数,默认为1。
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
//如果原数组有空位,flat()方法会跳过空位。
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]
[1, [2, [3]]].flat(Infinity) //Infinity:不管有多少层嵌套,都要转成一维数组
// [1, 2, 3]
2.flatMap()
方法对原数组的每个成员执行一个函数,然后对返回值组成的数组执行flat()
方法。该方法返回一个新数组,不改变原数组。传入函数(类似map
),只能展开一层
九、数组的空位的处理
1.ES5:
forEach()
,filter()
,reduce()
,every()
和some()
都会跳过空位map()
会跳过空位,但会保留这个值join()
和toString()
会将空位视为undefined
,而undefined
和null
会被处理成空字符串。
2.ES6:
明确将空位转为undefined
[...['a',,'b']]
// [ "a", undefined, "b" ]