摘自ES6入门--阮一峰es6
扩展运算符(spread)是三个点(...
)。它比如 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。数组
(1)复制数组数据结构
ES5 只能用变通方法来复制数组。函数
const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
扩展运算符提供了复制数组的简便写法。spa
const a1 = [1, 2]; // 写法一 const a2 = [...a1]; // 写法二 const [...a2] = a1;
(2)合并数组prototype
// ES5的合并数组 arr1.concat(arr2, arr3); // [ 'a', 'b', 'c', 'd', 'e' ] // ES6的合并数组 [...arr1, ...arr2, ...arr3] // [ 'a', 'b', 'c', 'd', 'e' ]
(3)与解构赋值结合rest
若是将扩展运算符用于数组赋值,只能放在参数的最后一位,不然会报错。code
const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错
(4)字符串对象
扩展运算符还能够将字符串转为真正的数组。字符串
[...'hello'] // [ "h", "e", "l", "l", "o" ]
凡是涉及到操做四个字节的 Unicode 字符的函数,都有这个问题。所以,最好都用扩展运算符改写。
'x\uD83D\uDE80y'.length // 4 [...'x\uD83D\uDE80y'].length // 3
Array.from
方法用于将两类对象转为真正的数组:相似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
Array.of
方法用于将一组值,转换为数组。
这个方法的主要目的,是弥补数组构造函数Array()
的不足。由于参数个数的不一样,会致使Array()
的行为有差别。
Array() // [] Array(3) // [, , ,] Array(3, 11, 8) // [3, 11, 8]
Array.of(3, 11, 8) // [3,11,8] Array.of(3) // [3] Array.of(3).length // 1
数组实例的find
方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,全部数组成员依次执行该回调函数,直到找出第一个返回值为true
的成员,而后返回该成员。若是没有符合条件的成员,则返回undefined
。
[1, 4, -5, 10].find((n) => n < 0)
[1, 5, 10, 15].find(function(value, index, arr) { return value > 9; }) // 10
上面代码中,find
方法的回调函数能够接受三个参数,依次为当前的值、当前的位置和原数组。
[1, 5, 10, 15].findIndex(function(value, index, arr) { return value > 9; }) // 2
fill
方法使用给定值,填充一个数组。
['a', 'b', 'c'].fill(7) // [7, 7, 7] new Array(3).fill(7) // [7, 7, 7]
上面代码代表,fill
方法用于空数组的初始化很是方便。数组中已有的元素,会被所有抹去。
fill
方法还能够接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
['a', 'b', 'c'].fill(7, 1, 2) // ['a', 7, 'c']
ES6 提供三个新的方法——entries()
,keys()
和values()
——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),能够用for...of
循环进行遍历,惟一的区别是keys()
是对键名的遍历、values()
是对键值的遍历,entries()
是对键值对的遍历。
Array.prototype.includes
方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes
方法相似。ES2016 引入了该方法。
[1, 2, 3].includes(2) // true [1, 2, 3].includes(4) // false [1, 2, NaN].includes(NaN) // true
数组的空位指,数组的某一个位置没有任何值。好比,Array
构造函数返回的数组都是空位。
ES5 对空位的处理,已经很不一致了,大多数状况下会忽略空位。
forEach()
, filter()
, reduce()
, every()
和some()
都会跳过空位。map()
会跳过空位,但会保留这个值join()
和toString()
会将空位视为undefined
,而undefined
和null
会被处理成空字符串。
ES6 则是明确将空位转为undefined
。
Array.from
方法会将数组的空位,转为undefined
,也就是说,这个方法不会忽略空位。