JS实现手写 forEach算法示例


Posted in Javascript onApril 29, 2020

本文实例讲述了JS实现手写 forEach算法。分享给大家供大家参考,具体如下:

手写 forEach

forEach()方法对数组的每个元素执行一次提供的函数

arr.forEach(callback(currentValue [, index [, array]])[, thisArg]);

  • callback

    • currentValue
      数组中正在处理的当前元素。
    • index 可选
      数组中正在处理的当前元素的索引。
    • array 可选
      forEach() 方法正在操作的数组。
    • thisArg 可选
      可选参数。当执行回调函数 callback 时,用作 this 的值。
  • 没有返回值

如果提供了一个 thisArg 参数给 forEach 函数,则参数将会作为回调函数中的 this 值。否则 this 值为 undefined。回调函数中 this 的绑定是根据函数被调用时通用的 this 绑定规则来决定的。

let arr = [1, 2, 3, 4];

arr.forEach((...item) => console.log(item));

// [1, 0, Array(4)] 当前值
function Counter() {
 this.sum = 0;
 this.count = 0;
}

// 因为 thisArg 参数(this)传给了 forEach(),每次调用时,它都被传给 callback 函数,作为它的 this 值。
Counter.prototype.add = function(array) {
 array.forEach(function(entry) {
  this.sum += entry;
  ++this.count;
 }, this);
 // ^---- Note
};

const obj = new Counter();
obj.add([2, 5, 9]);
obj.count;
// 3 === (1 + 1 + 1)
obj.sum;
// 16 === (2 + 5 + 9)
  • 每个数组都有这个方法
  • 回调参数为:每一项、索引、原数组
Array.prototype.forEach = function(fn, thisArg) {
 var _this;
 if (typeof fn !== "function") {
  throw "参数必须为函数";
 }
 if (arguments.length > 1) {
  _this = thisArg;
 }
 if (!Array.isArray(arr)) {
  throw "只能对数组使用forEach方法";
 }

 for (let index = 0; index < arr.length; index++) {
  fn.call(_this, arr[index], index, arr);
 }
};

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript修改css样式style
Apr 15 Javascript
JavaScript 构造函数 面相对象学习必备知识
Jun 09 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
关于input全选反选恶心的异常情况
Jul 24 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
深入理解vue中的$set
Jun 01 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
vue指令做滚动加载和监听等
May 26 Javascript
写给新手同学的vuex快速上手指北小结
Apr 14 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 #Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 #Javascript
深入浅析vue全局环境变量和模式
Apr 28 #Javascript
你准备好迎接vue3.0了吗
Apr 28 #Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
Apr 28 #Javascript
JavaScript 禁止用户保存图片的实现代码
Apr 28 #Javascript
JS求解两数之和算法详解
Apr 28 #Javascript
You might like
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
PyCharm代码格式调整方法
2018/05/23 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
大整数数相乘的问题
2012/07/22 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
单位租房协议书样本
2014/10/30 职场文书
售票员岗位职责
2015/02/15 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
详解redis分布式锁的这些坑
2021/05/19 Redis
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android
「回转企鹅罐」10周年纪念展「輪るピングドラム展」海报公开
2022/03/22 日漫
MySQL去除密码登录告警的方法
2022/04/20 MySQL