ES 6 系列之数组的扩展
扩展运算符
基本使用,扩展运算符是什么,其实就是三个点( ...
),在2. 变量的解构赋值 - 数组 和 4. 函数的扩展 - rest 参数中,接触过。
其实就是讲一个数组转为用逗号分隔的参数序列。
1 | let arr = [1, 2, 3, 4, 5]; |
从上面的代码中,我们能够看出,其实扩展运算符就是拆解数组、字符串等类似结构。
当然,在这里需要注意的是只能拆一层的内容,如果数组中有对象,或者嵌套了一个数组是不可拆的。
1 | let arr = [1, 2, { a: 1 }, 4]; |
在对象中使用大多用来拷贝一个对象,并进行部分修改。
1 | let obj = { |
数组新增的方法
Array.form()
该方法用于将类似数组的对象和可遍历的对象转为真正的数组
1 | let arrayLike = { |
Array.of()
该方法用于将一组值转化成数组
1 | let arr = Array.of(1, 2, 3, 4); |
新增的实例方法
find() 和 findIndex()
- find()
find()
方法,简单来说就是在数组中找出想要的那个值。
可以传入三个参数,第一个参数表示,当前值;第二个参数表示,当前值所在数组中的位置;第三个参数表示,原数组。当然,find()
顾名思义,就是查询,会找出第一个返回 true
的成员。
1 | let arr = [1, 3, 5, 7, 9]; |
find()
方法中,可以传递第二个参数,用来绑定 this
1 | let age = { |
在上面通过参数二传入一个对象,来绑定 this
。当然这里可以会有疑问,为什么不用箭头函数了? 这里具体可以去看看 普通函数与箭头函数的 this
指向问题。
- findIndex()
findIndex()
方法与 find()
方法非常接近,**返回第一个符合条件的成员的位置(也就是数组的下标),如果找不到,则返回 -1
**。
1 | let arr = [1, 3, 5, 7, 9]; |
findIndex()
方法是可以通过 Objecy.is(NaN)
来识别出 NaN
的。
1 | console.log([NaN].findIndex((val) => Object.is(NaN, val))); |
fill()
fill
方法使用给定值,填充一个数组。
参数可传一共三个
- 第一个参数 - 被填充的值。
- 第二个、第三个参数 - 用于填充的起始位置和结束位置
后两个参数可以不传,视为所有元素都是被填充元素。
1 | let arr = [1, 2, 3]; |
keys()、values() 和 entries()
ES6 提供的新的方法 用来遍历数组 。返回的都是一个遍历器对象,可以用 for...of
循环进行遍历。
- keys()
keys()
实例方法,就是为了遍历数组的 key。
1 | let arr = ['x', 'y', 'z']; |
- values()
values()
实例方法,是为了遍历数组的值。
1 | let arr = ['x', 'y', 'z']; |
- entries()
entries()
实例方法,是对键值对的遍历。 在这里还用到了数组的解构赋值。
1 | let arr = ['x', 'y', 'z']; |
上面代码中的 [key, value]
,其实就是遍历 arr.entries()
,并对其中一个值进行解构赋值。
可以来看看不使用 for...of
的写法,需要自己手动调用遍历器对象的 next
方法,然后.value
去取到相应值,为了方便这里就写在一起了
1 | let arr = ['x', 'y', 'z']; |
includes()
includes()
实例方法,就是用来做一个判断,表示某个数组是否包含给定过的值,与字符串的 includes
方法类似。
1 | let arr = ['x', 'y', 'z', undefined, NaN]; |
includes()
方法的第二个参数表示搜索的起始位置
1 | let arr = ['x', 'y', 'z', undefined, NaN]; |
上面的例子表示,检索数组从下标 1
开始检索,所以第一个参数 'x'
,就检索不到啦。
flat(),flatMap()
- flat()
flat()
就是简单来说就是 数组的扁平化,如果数组内嵌套数组,那就可以将其转为单层数组。
1 | let arr = [1, 2, 3, [4]]; |
当然,默认情况下,只会偏平一层,如果传入参数就可以偏平自己需要的层数。
1 | let arr = [1, 2, [3, [4, [5]]]]; |
注意
如果你需要无论多少层都将其转化为一层,使用正无穷(Infinity)
作为参数即可。
如果数组有空位,flat()
函数则会将空位跳过
1 | let arr = [1, [2, [3, [4, [5, [6]]]]]]; |
- flatMap()
flatMap()
实例方法,可以理解为,对数组进行 map
操作,然后对返回值组成的数组执行 flat()
方法。该实例方法,返回一个新的数组,不会改变原数组。
1 | let arr = [1, 2, 3, [4]]; |
注意
该方法只能展开一层,无法多层展开,有兴趣的,可以去验证一下。