每次总结其实都是把阮大大的东西先看了一遍,然后又总结一遍,加深印象而已,其实看原文更详细这里。
1. Array.from()
Array.from()方法可以用于将两类对象转为真正的数组:类似数组的对象和可比案例的对象。
| 1 | 
 | 
只要是部署了Iterator接口的数据结构,Array.from()都能把他转为数组。
注:Iterator是一种接口,为各种不痛的数据结构提供统一的访问机制,即任何数据结构只要有Iterator的话都可以完成遍历操作。这个在后面会详细的学到。这里
| 1 | 
 | 
如上,字符串和Set结构都具有Iterator接口,都可以转为真正的数组。
一个数组也可以用Array.from方法,只不过返回的是一个一样的新数组。
任何有length属性的对象,都可以通过Array.from方法转为数组。
| 1 | 
 | 
如上,就算这个对象只有一个属性,而没有键值对,还是会返回一个成员都为undefined的数组。
对于还没有部署这个方法的浏览器,可以用Array.prototype.slice方法代替。
| 1 | 
 | 
Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值返回为一个数组。
| 1 | 
 | 
下面的例子是取出一组DOM节点的文本内容。
| 1 | 
 | 
下面的例子是将数组中布尔值为false的成员转为0。
| 1 | 
 | 
下面的例子是返回各种数据的类型。
| 1 | 
 | 
Array.from()的另一个应用是,可以将字符串转为数组。然后返回字符串的长度。因为他能正确处理各种Unicode字符。
| 1 | 
 | 
2. Array.of()
Array.of()方法用于将一组值,转换为数组。
| 1 | 
 | 
这个方法主要是为了弥补数组构造函数Array()的不足。因为参数个数的不同,Array()返回的数组有差异。
| 1 | 
 | 
如上可以看出,当参数是一个的时候,其实是指定数组的长度;当参数不少于2个的时候,Array()才会返回一个新的数组。
而Array.of()不会存在参数不同的行为差异,所以可以替代Array()。
| 1 | 
 | 
Array.of方法可以用下面的代码模拟实现。
| 1 | 
 | 
3. 数组实例的copyWithin()
数组实例的copyWithin()方法,会在原数组上进行操作,所以使用这个方法,会修改当前数组。
| 1 | 
 | 
他接受三个参数:
- target(必须):从该位置开始替换数据。
- start(可选):从该位置开始读取数据,默认为0。如果是负数,表示倒数。
- end(可选):到该位置停止读取数据,默认等于数组长度。如果为负数,表示倒数。
| 1 | 
 | 
如上代码,这个表示把3号位置到数组结束的成员(4和5),复制到从0号开始的位置,替换掉原来的1和2。
更多例子:
| 1 | 
 | 
4. 数组实例的find()和findIndex()
数组实例的find()方法,用于找出第一个符合条件的数组成员。他的参数是一个回调函数,所有数组的成员依次执行这个回调函数,直到找出一个返回值为ture的成员,然后返回该成员,如果没有符合条件的就返回undefined。
| 1 | 
 | 
如上是找到了第一个小于0的成员。
| 1 | 
 | 
如上代码,是找到了第一个大于9的成员。
数组实例的findIndex方法的用法和find方法非常类似,他会犯的是第一个符合条件的成员在数组中的位置。只是如果成员都不符合条件,他返回的是-1。
| 1 | 
 | 
这两个方法也都可以发现NaN,弥补了IndexOf方法的不足。
| 1 | 
 | 
5. 数组实例的fill()
fill方法可以用给定的值填充一个数组。
| 1 | 
 | 
如上代码,fill方法可以用于空数组的初始化。如果数组中已有元素,会被全部替换掉。
fill方法接受两个可选参数,用于指定起始位置和结束位置。
| 1 | 
 | 
6. 数组实例的entries(),keys()和values()
ES6提供三个新的方法——entries(),keys()和values(),用于遍历数组。他们都会返回一个遍历器对象。可以用for...of进行循环遍历,唯一的区别是keys()是对键名遍历、values()是对键值进行遍历、entries()是对键值对进行遍历。
| 1 | 
 | 
7. 数组实例的includes()
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。此方法属于ES7,但是Babel转码器已经支持。
| 1 | 
 | 
该方法的第二个参数搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果倒数的大于数组的长度,则会重置为0开始。
| 1 | 
 | 
在没有这个方法之前,我们通常使用数组的indexOf方法,检查是否包含某个值。
| 1 | 
 | 
但是indexOf方法有两个缺点,一是不够语义化,表达起来不够直观,二是,可能会对NaN产生误判。
| 1 | 
 | 
但是使用includes方法的是不一样的判断算法,不会产生误判。
| 1 | 
 | 
8. 数组的空位
数组的空位,是指数组的某一个位置没有任何值,比如Array构造函数返回的数组都是空位。
| 1 | 
 | 
这里要注意,空位不是undefined,空位是没有任何值。请看下面代码。
| 1 | 
 | 
如上代码,数组一,尽管是undefined但是依然是有值的,而数组二的0号位置没有值。
ES5对空位的处理,是很不一致的,大多数情况会忽略空位。
- forEach(),- filter(),- every()和- some()都会跳过空位。
- map()会跳过空位,但会保留这个值。
- join()和- toString()会将空位视为undefined,而undefined和null会被处理成空字符串。
| 1 | 
 | 
而ES6则明确将空位转为undefined。
Array.from方法会将数组的空位,转为undefined,也就是说这个方法不会忽略空位。
| 1 | 
 | 
扩展运算符(...)也会将空位转为undefined。
| 1 | 
 | 
copyWithin()会连空位一起拷贝。
| 1 | 
 | 
fill()会将空位视为正常的数组位置。
| 1 | 
 | 
for...of循环也会遍历空位。
| 1 | 
 | 
如上代码,数组arr有两个空位,for...of并没有忽略他们。如果改成map方法遍历,空位是会跳过的。
9. 数组推导
数组推导提供了简洁写法,可以通过现有数组生成新数组。ES7会有折现功能,现在Bable转码器已经支持这个功能。
| 1 | 
 | 
如上代码,通过for...of可能在a1的基础上生成a2。
在数组推导中,for...of结构总是鞋在最前面,返回的表达式写在最后面。
| 1 | 
 | 
如上代码,if语句要卸载for...of与返回的表达式之间,而且可以多个if语句连用。
再多举一个例子。
| 1 | 
 | 
数组推导可以替代map和filter方法。
| 1 | 
 | 
如上代码,模拟map功能只要单纯的for...of循环就可以了,如果模拟filter除了循环,还要加上if语句。
在一个数组推到中,还可以使用多个for...of构成多重循环。
| 1 | 
 | 
字符串可以视为数组,所以字符串也可以直接用于数组推导。
| 1 | 
 |