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 相关文章推荐
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
js去除浏览器默认底图的方法
Jun 08 Javascript
Underscore源码分析
Dec 30 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
ionic实现底部分享功能
May 11 Javascript
vue2的todolist入门小项目的详细解析
May 11 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
mock.js实现模拟生成假数据功能示例
Jan 15 Javascript
axios实现文件上传并获取进度
Mar 25 Javascript
layui 上传图片 返回图片地址的方法
Sep 26 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程序中防止盗链
2008/04/09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
jquery获得keycode的示例代码
2013/12/30 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
python实现简单socket通信的方法
2016/04/19 Python
Python深入06——python的内存管理详解
2016/12/07 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
威尔逊皮革:Wilsons Leather
2018/12/07 全球购物
Jar包的作用是什么
2014/03/30 面试题
C语言中break与continue的区别
2012/07/12 面试题
Jdbc数据访问技术面试题
2012/03/30 面试题
股份转让协议书
2014/04/12 职场文书
新教师个人工作总结
2015/02/06 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
Python实现8种常用抽样方法
2021/06/27 Python
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技