详解JavaScript之Array.reduce源码解读


Posted in Javascript onNovember 01, 2020

前言

reduce(...)方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值(累计作用)

此方法接受两个参数:callback(...)(必选)、initialValue(可选)。
callback(...)接受4个参数:Accumulator (acc) (累计器)、Current Value (cur) (当前值)、Current Index (idx) (当前索引)、Source Array (src) (源数组)。

注意点:
1、callback(...)一般需要返回值
2、不会改变原数组

实现思路
1、先获取初始累计的值(分成两种情况:有提供initialValue || 未提供initialValue)
2、遍历数组并执行callback(...)
3、返回累计值

源码实现

Array.prototype.myReduce = function(callback, initialValue) {
 if(this === null) {
  throw new TypeError( 'Array.prototype.reduce called on null or undefined' );
 }
 if (typeof callback !== 'function') {
  throw new TypeError( callback + ' is not a function');
 }
 const O = Object(this);
 const lenValue = O.length;
 const len = lenValue >>> 0;
 if(len === 0 && !initialValue) {
  throw new TypeError('the array contains no elements and initialValue is not provided');
 }
 let k = 0;
 let accumulator;
 // 分成两种情况来获取accumulator
 // 有提供initialValue accumulator=initialValue
 // 没有提供initialValue accumulator=数组的第一个有效元素
 if(initialValue) {
  accumulator = initialValue;
 } else {
  let kPressent = false;
  while(!kPressent && k < len) {
   const pK = String(k);
   kPressent = O.hasOwnProperty(pK);
   if(kPressent) {
    accumulator = O[pK];
   };
   k++;
  }
  if(!kPressent) {
   throw new TypeError('the array contains error elements');
  }
 }
 // 当accumulator=initialValue时 k=0
 // accumulator=数组的第一个有效元素时 k=1
 while(k < len) {
  if(k in O) {
   // callback一般需要返回值
   accumulator = callback(accumulator, O[k], k, O);
  }
  k++;
 }
 return accumulator;
}
let r = [1,2,3].myReduce(function (prevValue, currentValue, currentIndex, array) {
 return prevValue + currentValue;
}, 22);
console.log(r); // 28

参考链接:

reduce-mdn
官方规范

到此这篇关于详解JavaScript之Array.reduce源码解读的文章就介绍到这了,更多相关JavaScript Array.reduce源码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
学习jquery之一
Apr 27 Javascript
对字符串进行HTML编码和解码的JavaScript函数
Feb 01 Javascript
jQuery关于导航条背景切换效果实现示例
Sep 04 Javascript
jQuery设置指定网页元素宽度和高度的方法
Mar 25 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
Nov 30 Javascript
原生js实现图片层叠轮播切换效果
Feb 02 Javascript
Javascript字符串常用方法详解
Jul 21 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 Javascript
微信小程序实现星星评分效果
Nov 01 #Javascript
Express 配置HTML页面访问的实现
Nov 01 #Javascript
ant design vue 表格table 默认勾选几项的操作
Oct 31 #Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 #Javascript
Ant design vue中的联动选择取消操作
Oct 31 #Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 #Javascript
vue中可编辑树状表格的实现代码
Oct 31 #Javascript
You might like
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python中的集合类型知识讲解
2015/08/19 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
Python gevent协程切换实现详解
2020/09/14 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
UDP协议功能
2013/01/06 面试题
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
财务方面个人工作的自我评价
2013/12/28 职场文书
办理护照介绍信
2014/01/16 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
市场部岗位职责
2015/02/12 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书