详解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 相关文章推荐
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
jQuery实现复选框批量选择与反选的方法
Jun 17 Javascript
利用JavaScript判断浏览器类型及版本
Aug 23 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
Sep 12 Javascript
JavaScript类的写法
Sep 17 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
Mar 28 Javascript
详解angularjs 学习之 scope作用域
Jan 15 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
js实现拾色器插件(ColorPicker)
May 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
PHP输出日历表代码实例
2015/03/27 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
JQuery 前台切换网站的样式实现
2009/06/22 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
JS中数组重排序方法
2016/11/11 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
python 如何区分return和yield
2020/09/22 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
感恩之星事迹材料
2014/05/03 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
邀请函的格式
2015/01/30 职场文书
公司门卫岗位职责
2015/04/13 职场文书
趣味运动会加油词
2015/07/18 职场文书