03 数组的扩展

107 阅读4分钟
├── 数组的扩展
│   ├── 扩展运算符
│   │     └─ 含义
│   │         └─ 扩展运算符(spread)是三个点(`...`)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
│   │     └─ 替代函数的 apply() 方法
│   │         └─ 由于扩展运算符可以展开数组,所以不再需要`apply()`方法将数组转为函数的参数了。
│   │     └─ 扩展运算符的应用
│   │         └─ (1)复制数组 数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
│   │         └─ (2)合并数组 扩展运算符提供了数组合并的新写法。
│   │         └─ (3)与解构赋值结合 扩展运算符可以与解构赋值结合起来,用于生成数组。
│   │         └─ (4)字符串 扩展运算符还可以将字符串转为真正的数组。
│   │         └─ (5)实现了 Iterator 接口的对象 任何定义了遍历器(Iterator)接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组。
│   │         └─ ((6MapSet 结构,Generator 函数  扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。
│   ├── Array.from()
│   │     └─ `Array.from()`方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 SetMap)。
│   │     └─ `Array.from()`还可以接受一个函数作为第二个参数,作用类似于数组的`map()`方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
│   │     └─ 扩展运算符背后调用的是遍历器接口(`Symbol.iterator`),如果一个对象没有部署这个接口,就无法转换。`Array.from()`方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有`length`属性。因此,任何有`length`属性的对象,都可以通过`Array.from()`方法转为数组,而此时扩展运算符就无法转换。
│   ├── Array.of()
│   │     └─ `Array.of()`方法用于将一组值,转换为数组。
│   ├── 实例方法:copyWithin()
│   │     └─ 数组实例的`copyWithin()`方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
│   ├── 实例方法:find() 和 findIndex()
│   │     └─ 数组实例的`find`方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为`true`的成员,然后返回该成员。如果没有符合条件的成员,则返回`undefined`。
│   │     └─ 数组实例的`findIndex`方法的用法与`find`方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回`-1`。
│   ├── 实例方法:fill()
│   │     └─ `fill`方法使用给定值,填充一个数组。 `fill`方法用于空数组的初始化非常方便。数组中已有的元素,会被全部抹去。
│   ├── 实例方法:entries(),keys() 和 values()
│   │     └─ ES6 提供三个新的方法——`entries()``keys()``values()`——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用`for...of`循环进行遍历,唯一的区别是`keys()`是对键名的遍历、`values()`是对键值的遍历,`entries()`是对键值对的遍历。
│   ├── 实例方法:includes()
│   │     └─ `Array.prototype.includes`方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的`includes`方法类似。ES2016 引入了该方法。
│   ├── 实例方法:flat(),flatMap()
│   │     └─ 数组的成员有时还是数组,`Array.prototype.flat()`用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。
│   │     └─ `flatMap()`方法对原数组的每个成员执行一个函数(相当于执行`Array.prototype.map()`),然后对返回值组成的数组执行`flat()`方法。该方法返回一个新数组,不改变原数组。
│   ├── 实例方法:at()
│   │     └─ const arr = [5, 12, 8, 130, 44]; arr.at(2) // 8
│   ├── 数组的空位
│   │     └─ 数组的空位指的是,数组的某一个位置没有任何值,比如`Array()`构造函数返回的数组都是空位。
│   │     └─ `forEach()`, `filter()`, `reduce()`, `every()``some()`都会跳过空位。
│   │     └─ `map()`会跳过空位,但会保留这个值
│   │     └─ `join()``toString()`会将空位视为`undefined`,而`undefined``null`会被处理成空字符串。
│   │     └─ `Array.from()`方法会将数组的空位,转为`undefined`,也就是说,这个方法不会忽略空
│   │     └─ 扩展运算符(`...`)也会将空位转为`undefined`。
│   ├── Array.prototype.sort() 的排序稳定性
│   │     └─ 排序稳定性(stable sorting)是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变。