每次总结其实都是把阮大大的东西先看了一遍,然后又总结一遍,加深印象而已,其实看原文更详细这里。
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 |
|