数组的扩展

42 阅读3分钟

扩展运算符

扩展运算符是三个点(...),如同 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列

有了扩展运算符,可以不再需要使用 apply 方法将数组转化为函数的参数

任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组

扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,例如 Map 结构

Array.from()

Array.from() 用于将两类对象转为真正的数组

  • 类数组对象
  • 可遍历对象

只要是部署了 Iterator 接口的数据结构,Array.from 都能将其转为数组

如果参数是一个真正的数据,Array.from 会返回一个一模一样的新数组

Array.from 还可以接受第二个参数,用来对每个元素进行处理,将处理后的值放入返回的数组

Array.of()

Array.of 用于将一组值转换为数组,这个方法的目的是弥补数组构造函数(Array())的不足,因为参数个数的不同会导致Array()的行为有差异

数组实例的 copyWithin()

copyWithin 方法会在当前数组内部将指定位置的成员赋值到其它位置(会覆盖原成员),然后返回当前数组,也就是,使用这个方法会修改当前数组

接受三个参数

  • target(必须):从该位置开始替换数据
  • start(可选):从该位置开始读取数据,默认为0,如果是负值,表示倒数
  • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负数,表示倒数

数组实例的 find() 和 findIndex()

find 用于找出第一个符合条件的数组成员

  • 参数是一个回调函数,所有成员依次执行该回调函数,直到找出第一个返回值为 true 的成员,然后返回该成员,如果没有符合条件的成员,返回 undefined

findIndexfind 类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,返回 -1

数组实例的 fill()

fill 方法用给定的值填充一个数组

数组实例 entries()、keys() 和 values()

  • entries() 是对键值对的遍历
  • keys() 是对键名的遍历
  • values() 是对键值的遍历

数组实例的 includes()

includes 返回一个布尔值,表示某个数组是否包含给定的值

Map 和 Set 数据结构有一个 has 方法,需要和 includes 区分

  • Map 的 has 方法是用来查找键名的
  • Set 的 has 方法是用来查找值的

数组的空位

数组的空位指数组的某一个位置没有任何值,空位不是 undefined ,一个位置的值等于 undefined 依然是有值的,空位是没有任何值的,in 运算符可以说明这一点

0 in [undefined, undefined, undefined] // true
0 in [,,] // false

ES5 对空位的处理很不一致,大部分情况下会忽略空位

  • forEach、filter、every、some 都会跳过空位
  • map 会跳过空位,但会保留这个值
  • join 和 toString 会把空位视为 undefined ,而 undefined 和 null 会被处置为空字符串

ES6则明确将空位转为 undefined

由于空位的处理规则非常不一致,所以建议避免出现空位