无论是for…in还是for…of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式

1.for…in 语句以原始插入顺序迭代对象的可枚举属性。
2.for…of 语句遍历可迭代对象定义要迭代的数据(不包括从父类对象中继承的属性)。

以下示例显示了与Array一起使用时,for…of循环和for…in循环之间的区别。

//定义Object对象属性objCustom
Object.prototype.objCustom = function() {};
//定义Array对象属性arrCustom
Array.prototype.arrCustom = function() {}; let iterable = [3, 5, 7];
iterable.foo = 'hello'; //for in 会继承 for (let i in iterable) {
console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
} for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // logs 0, 1, 2, "foo"
}
} // for of
for (let i of iterable) {
console.log(i); // logs 3, 5, 7
}
每个对象将继承objCustom属性,并且作为Array的每个对象将继承arrCustom属性,
因为将这些属性添加到Object.prototype和Array.prototype。
由于继承和原型链,对象iterable继承属性objCustom和arrCustom。

for in

for (let i in iterable) {
console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}

此循环仅以原始插入顺序记录iterable 对象的可枚举属性。它不记录数组元素3, 5, 7 或hello,因为这些不是枚举属性。但是它记录了数组索引以及arrCustom和objCustom。如果你不知道为什么这些属性被迭代,array iteration and for…in中有更多解释。

for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // logs 0, 1, 2, "foo"
}
}

这个循环类似于第一个,但是它使用hasOwnProperty() 来检查,如果找到的枚举属性是对象自己的(不是继承的)。如果是,该属性被记录。记录的属性是0, 1, 2和foo,因为它们是自身的属性(不是继承的)。属性arrCustom和objCustom不会被记录,因为它们是继承的。

for...in不应该用于迭代一个 Array,其中索引顺序很重要。

for of

for (let i of iterable) {
console.log(i); // logs 3, 5, 7
}

该循环迭代并记录iterable作为可迭代对象定义的迭代值,这些是数组元素 3, 5, 7,而不是任何对象的属性。

forEach

forEach是ES5数组中引入的一个方法(Array​.prototype​.for​Each()),用于数组的遍历。

var array1 = ['a', 'b', 'c'];

array1.forEach(function(value,index,array) {
console.log(value,index,array);
}); //> "a" 0 Array ["a", "b", "c"]
//> "b" 1 Array ["a", "b", "c"]
//> "c" 2 Array ["a", "b", "c"]

语法:

arr.forEach(callback[, thisArg]);

参数

callback
为数组中每个元素执行的函数,该函数接收三个参数:
currentValue
数组中正在处理的当前元素。
index可选
数组中正在处理的当前元素的索引。
array可选
forEach() 方法正在操作的数组。
thisArg可选
可选参数。当执行回调函数时用作 this 的值(参考对象)。

---------------------
作者:相濡以沫丶
来源:CSDN
原文:https://blog.csdn.net/qq_32279193/article/details/78685366
版权声明:本文为博主原创文章,转载请附上博文链接!

for...in 、for...of 、forEach 的区别的更多相关文章

  1. for循环与foreach的区别

    for循环与foreach的区别 foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后 ...

  2. every();some();filter();map();forEach()各自区别:

    every();some();filter();map();forEach()各自区别: (1)every()方法:(返回值为boolean类型) 对数组每一项都执行测试函数,知道获得对指定的函数返回 ...

  3. for和foreach的区别

    public class Program { public static void Main() { Program program = new Program(); program.For();// ...

  4. JS中map与forEach的区别

    很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...

  5. IL角度理解for 与foreach的区别——迭代器模式

    IL角度理解for 与foreach的区别--迭代器模式 目录 IL角度理解for 与foreach的区别--迭代器模式 1 最常用的设计模式 1.1 背景 1.2 摘要 2 遍历元素 3 删除元素 ...

  6. Javascript/Jquery 中each() 和forEach()的区别

    从名字看上去这两个方法好像有点关系,但在javascript中它们区别还是挺大的. forEach() 用于数组的操作,对数组中的每个元素执行制定的函数(不是数组不能使用forEach()方法). 而 ...

  7. js keys方法和foreach方法区别

    keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...

  8. JavaScript中Map和ForEach的区别

    译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...

  9. JS中map和foreach的区别以及some和every的用法

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  10. js forEach for区别

    1.循环中断差别 具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...

随机推荐

  1. 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3

    系列介绍:这个系列是介绍如何用云原生技术来构建.测试.部署.和管理应用的内容专辑.做这个系列的初衷是为了推广云原生应用管理的最佳实践,以及传播开源标准和知识.在这个系列文章的开篇初探云原生应用管理(一 ...

  2. JVM的监控工具之jhat

    在上一篇文件文章中讲到了jhap的用法:https://www.cnblogs.com/cheng21553516/p/11223615.html,既然jhap可以转储堆的快照文件, 那么用什么来分析 ...

  3. QT+OpenGL(01)--实现三角形渲染

    1.openglwidget.ui <ui version="4.0"> <author/> <comment/> <exportmacr ...

  4. 1-HTTPS之SNI介绍

    原文:https://blog.51cto.com/zengestudy/2170245 介绍 早期的SSLv2根据经典的公钥基础设施PKI(Public Key Infrastructure)设计, ...

  5. 【maven】父子项目的一般姿势

    一.为什么需要创建maven父子项目. 一般一个业务较多的项目,如果我们做服务拆分的话,有些公共的模块就只能做成jar包了.你将util.constant.model封装成jar包是比较好的,如果da ...

  6. JavaScript addEventListener()事件监听方法

    addEventListener()方法将事件处理程序附加到指定的元素. addEventListener()方法将事件处理程序附加到元素,而不覆盖现有的事件处理程序. 您可以向一个元素添加许多事件处 ...

  7. JavaScript中的 JSON 和 JSONP

    JSON 和 JSONP JSONP是一种发送JSON数据的方法,无需担心跨域问题.JSONP不使用该XMLHttpRequest对象.JSONP使用<script>标签代替.由于跨域策略 ...

  8. 车间如何数字化?MES系统来助力

    对于生产过程复杂多变的离散制造企业而言,面临重重考验:生产作业计划频繁变更,制造工艺复杂,在生产过程中的临时插单.材料短缺等现象.通过MES制造执行管理解决方案,搭建协同管理平台,加强控制力.执行力和 ...

  9. 实施一套MES系统需要多少钱?

    在制造业深耕的人都知道MES系统对于企业的重要性.MES生产执行系统是制造业生产现场透明化管理的最佳解决方案,制造业工厂通过实施MES系统可以解决生产计划.排产调度.工艺管理.品质管理.现场数据采集和 ...

  10. 章节十四、3-执行JavaScript命令

    一.网页页面都是由html+css和javaScript组成的,如果页面中没有javaScript的存在,就不会有操作动作的执行,例如页面上你点击的按钮或者链接都离不开javaScript.(这一节不 ...