这节课依旧是介绍相关的 API,这些 API 都比较简单,实在忘记了,直接上网搜就行。代码都在 code 目录下边,把这些常见的一些数组 API 给过一遍,有个印象,可以看懂,就 pass。
Array 的静态成员和实例成员
凡是通过 Array 构造函数创建的对象,都是数组。
静态成员
- from方法:可以将一个伪数组转换为真数组
- isArray方法:判断一个给定的数据,是否为一个真数组
- of方法:类似于中括号创建数组,依次赋予数组每一项的值
实例成员
- fill方法:用某个数据填充数组
- pop
- push
- reverse:将当前数组颠倒顺序
- shift
- sort:对数组进行排序
- splice
- unshift
以下是纯函数
- concat
- includes: 数组中是否包含满足条件的元素
- join
- slice
- indexOf
- lastIndexOf
- forEach: 遍历数组
- every:是否所有元素都满足条件
- some:是否至少有一个元素满足条件
- filter:过滤,得到满足条件的元素组成的新数组
- find: 查找第一个满足条件的元素,返回元素本身,如果没有找到,返回undefined
- findIndex: 查找第一个满足条件的元素,返回元素的下标
- map:映射,将数组的每一项映射称为另外一项
- reduce:统计,累计
无副作用函数(纯函数):不会导致当前对象发生改变
reduce
若面试的时候要问数组的 api,那应该也是问 reduce 这个 api 了,一般会问 reduce 的实现原理。在介绍 reduce 的原理之前,先看看下面的案例,了解一下它的功能。

Array.prototype.myReduce = function (fn, initVal) {if (initVal === undefined) {initVal = this[0];for (let i = 1; i <= this.length - 1; i++) {console.log(initVal, this[i], i, this);initVal = fn(initVal, this[i], i, this);}return initVal;} else {for (let i = 0; i <= this.length - 1; i++) {console.log(initVal, this[i], i, this);initVal = fn(initVal, this[i], i, this);}return initVal;}};let r1 = [0, 1, 2, 3, 4].myReduce(function (p, n) {return p + n;});let r2 = [0, 1, 2, 3, 4].myReduce(function (p, n) {return p + n;}, 0);console.log(r2); // => 10console.log(r1); // => 10
对于初学者的我们而言,理解起来还是有点困难的,下面做一个简单地分析:
第一步:先了解一下 reduce 的调用方式,我们在调用 reduce 这个 api 时,有可能会传入两个参数,也有可能只会传入一个参数。对比两者之间的区别。
第二步:观察 accumulator 这个值,不难发现它是再不断累加的,若我们传递了第二个参数,那么 accumulator 的初始值就是我们传入的第二个参数的值;否则,accumulator 为数组的首项。我们在封装 myReduce 方法时,accumulator 应该定义为一个变量,每次调用函数 fn 时,都将该变量作为第一个参数传入,这样就可以实现累加的效果。
像是上面这样仿照原生的 api 来实现一个 myReduce api,我们也称之为 Polyfill,我们在看文档时,看到标题 Polyfil,我们就可以将其理解为仿照原生 api 实现原理的代码。
PS:简单看 Ployfill 这一部分,简单看看就好,看懂最好,看不懂说明目前水平还不够。😓
/*var arr = [1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6];去掉数组中的负数,然后对每一项平方,然后再对每一项翻倍,然后求和 不许使用循环语句。*/var arr = [1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6];var result = arr.filter(function (item) {return item >= 0;}).map(function (item) {return item * item;}).map(function (item) {return item * 2;}).reduce(function (sum, item) {return sum += item;}, 0)console.log(result);
var arr = [1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6];// 去掉数组中的负数, 然后对每一项平方, 然后再对每一项翻倍, 然后求和// 不许使用循环var result = arr.filter(function (item) {return item >= 0;}).map(function (item) {return item ** 2;}).map(function (item) {return item * 2;}).reduce(function (s, item) {return s + item;}, 0);console.log(result); // 182
