扩展运算符
含义
扩展运算符(spread)是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
1 | console.log(1, ...[2, 3, 4], 5) |
替代函数apply
1 | // ES5 的写法 |
应用
复制数组
1 | const a1 = [1, 2]; |
合并数组
1 | var more = [3,4]; |
结构赋值
1 | // ES5 |
字符串
1 | [...'hello'] |
实现了 Iterator 接口的对象
1 | let nodeList = document.querySelectorAll('div'); |
Map 和 Set 结构,Generator 函数
1 | let map = new Map([ |
Array.from()
Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
1 | let arrayLike = { |
扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。
Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
1 | Array.from(arrayLike, x => x * x); |
Array.of()
Array.of方法用于将一组值,转换为数组。弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。
1 | Array.of(3, 11, 8) // [3,11,8] |
Array.of方法可以用下面的代码模拟实现。
1 | function ArrayOf(){ |
数组实例的 copyWithin()
数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
1 | Array.prototype.copyWithin(target, start = 0, end = this.length) |
数组实例的 find() 和 findIndex()
数组实例的find
方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true
的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
。
1 | [1, 5, 10, 15].find(function(value, index, arr) { |
数组实例的findIndex
方法的用法与find
方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
1 | [1, 5, 10, 15].findIndex(function(value, index, arr) { |
数组实例的 fill()
fill方法使用给定值,填充一个数组。
1 | ['a', 'b', 'c'].fill(7) |
fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
1 | ['a', 'b', 'c'].fill(7, 1, 2) |
数组实例的 entries(),keys() 和 values()
ES6 提供三个新的方法——entries()
,keys()
和values()
——用于遍历数组。它们都返回一个遍历器对象,可以用for...of
循环进行遍历,唯一的区别是keys()
是对键名的遍历、values()
是对键值的遍历,entries()
是对键值对的遍历。
1 | for (let index of ['a', 'b'].keys()) { |
数组实例的 includes()
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。
1 | [1, 2, 3].includes(2) // true |
空位
- forEach(), filter(), reduce(), every() 和some()都会跳过空位。
- map()会跳过空位,但会保留这个值
- join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
空位不等于undefind。
1 | 0 in [undefined, undefined, undefined] // true |
ES6 则是明确将空位转为undefined。
- Array.from方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。
- 扩展运算符(…)也会将空位转为undefined。
- copyWithin()会连空位一起拷贝。
- fill()会将空位视为正常的数组位置。
- for…of循环也会遍历空位。
- entries()、keys()、values()、find()和findIndex()会将空位处理成undefined。