返回顶部
首页 > 资讯 > 精选 >es6中for和foreach的区别有哪些
  • 849
分享到

es6中for和foreach的区别有哪些

2023-07-04 10:07:11 849人浏览 安东尼
摘要

这篇文章主要介绍“es6中for和foreach的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6中for和foreach的区别有哪些”文章能帮助大家解决问题。区别:1、forEach

这篇文章主要介绍“es6中for和foreach的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6中for和foreach的区别有哪些”文章能帮助大家解决问题。

区别:1、forEach是一个迭代器,是负责遍历(Array Set Map)可迭代对象的;而for是一种循环机制,只是能通过它遍历出数组。2、for循环中会用到一些中断行为,对于优化数组遍历查找是很好的,但由于forEach属于迭代器,只能按序依次遍历完成,所以不支持中断行为。3、forEach的循环起点只能为0,且不能进行人为干预;而for循环不同,可以人为控制循环起点。

for循环和forEach本质区别

for循环是js提出时就有的循环方法。

forEach是ES5提出的,挂载在可迭代对象原型上的方法,例如Array Set Map

forEach是一个迭代器,负责遍历可迭代对象。

那么遍历迭代可迭代对象分别是什么呢。

  • 遍历:指的对数据结构的每一个成员进行有规律的且为一次访问的行为。

  • 迭代:迭代是递归的一种特殊形式,是迭代器提供的一种方法,默认情况下是按照一定顺序逐个访问数据结构成员。迭代也是一种遍历行为。

  • 可迭代对象:ES6中引入了 iterable 类型,Array Set Map String arguments nodeList 都属于 iterable,他们特点就是都拥有 [Symbol.iterator] 方法,包含他的对象被认为是可迭代的 iterable

forEach 其实是一个迭代器,他与 for 循环本质上的区别是 forEach 是负责遍历(Array Set Map)可迭代对象的,而 for 循环是一种循环机制,只是能通过它遍历出数组。

什么是迭代器,当它被调用时就会生成一个迭代器对象(Iterator Object),它有一个 .next()方法,每次调用返回一个对象{value:value,done:Boolean}value返回的是 yield 后的返回值,当 yield 结束,done 变为 true,通过不断调用并依次的迭代访问内部的值。

迭代器是一种特殊对象。ES6规范中它的标志是返回对象的 next() 方法,迭代行为判断在 done 之中。在不暴露内部表示的情况下,迭代器实现了遍历。看代码

let arr = [1, 2, 3, 4]  // 可迭代对象let iterator = arr[Symbol.iterator]()  // 调用 Symbol.iterator 后生成了迭代器对象console.log(iterator.next()); // {value: 1, done: false}  访问迭代器对象的next方法console.log(iterator.next()); // {value: 2, done: false}console.log(iterator.next()); // {value: 3, done: false}console.log(iterator.next()); // {value: 4, done: false}console.log(iterator.next()); // {value: undefined, done: true}

我们看到了。只要是可迭代对象,调用内部的 Symbol.iterator 都会提供一个迭代器,并根据迭代器返回的next 方法来访问内部,这也是 for...of 的实现原理。

let arr = [1, 2, 3, 4]for (const item of arr) {    console.log(item); // 1 2 3 4 }

把调用 next 方法返回对象的 value 值并保存在 item 中,直到 valueundefined 跳出循环,所有可迭代对象可供for...of消费。再来看看其他可迭代对象:

function num(params) {    console.log(arguments); // Arguments(6) [1, 2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ]    let iterator = arguments[Symbol.iterator]()    console.log(iterator.next()); // {value: 1, done: false}    console.log(iterator.next()); // {value: 2, done: false}    console.log(iterator.next()); // {value: 3, done: false}    console.log(iterator.next()); // {value: 4, done: false}    console.log(iterator.next()); // {value: undefined, done: true}}num(1, 2, 3, 4)let set = new Set('1234')set.forEach(item => {    console.log(item); // 1 2 3 4})let iterator = set[Symbol.iterator]()console.log(iterator.next()); // {value: 1, done: false}console.log(iterator.next()); // {value: 2, done: false}console.log(iterator.next()); // {value: 3, done: false}console.log(iterator.next()); // {value: 4, done: false}console.log(iterator.next()); // {value: undefined, done: true}

所以可迭代对象中的 Symbol.iterator 属性被调用时都能生成迭代器,而 forEach 也是生成一个迭代器,在内部的回调函数中传递出每个元素的值

for循环和forEach的语法区别

了解了本质区别,在应用过程中,他们到底有什么语法区别呢?

  • forEach 的参数。

  • forEach 的中断。

  • forEach 删除自身元素,index不可被重置。

  • for 循环可以控制循环起点。

forEach 的参数

我们真正了解 forEach 的完整传参内容吗?它大概是这样:

arr.forEach((self,index,arr) =>{},this)

  • self: 数组当前遍历的元素,默认从左往右依次获取数组元素。

  • index: 数组当前元素的索引,第一个元素索引为0,依次类推。

  • arr: 当前遍历的数组。

  • this: 回调函数中this指向。

let arr = [1, 2, 3, 4];arr.forEach(function (self, index, arr) {    console.log(`当前元素为${self}索引为${index},属于数组${arr}`);}, person)

我们可以利用 arr 实现数组去重:

let arr1 = [1, 2, 1, 3, 1];let arr2 = [];arr1.forEach(function (self, index, arr) {    arr.indexOf(self) === index ? arr2.push(self) : null;});console.log(arr2);   // [1,2,3]

forEach 的中断

在js中有break return continue 对函数进行中断或跳出循环的操作,我们在 for循环中会用到一些中断行为,对于优化数组遍历查找是很好的,但由于forEach属于迭代器,只能按序依次遍历完成,所以不支持上述的中断行为。

let arr = [1, 2, 3, 4],    i = 0,    length = arr.length;for (; i < length; i++) {    console.log(arr[i]); //1,2    if (arr[i] === 2) {        break;    };};arr.forEach((self,index) => {    console.log(self);    if (self === 2) {        break; //报错    };});arr.forEach((self,index) => {    console.log(self);    if (self === 2) {        continue; //报错    };});

如果我一定要在 forEach 中跳出循环呢?其实是有办法的,借助try/catch

try {    var arr = [1, 2, 3, 4];    arr.forEach(function (item, index) {        //跳出条件        if (item === 3) {            throw new Error("LoopTerminates");        }        //do something        console.log(item);    });} catch (e) {    if (e.message !== "LoopTerminates") throw e;};

若遇到 return 并不会报错,但是不会生效

let arr = [1, 2, 3, 4];function find(array, num) {    array.forEach((self, index) => {        if (self === num) {            return index;        };    });};let index = find(arr, 2);// undefined

forEach 删除自身元素,index不可被重置

forEach 中我们无法控制 index 的值,它只会无脑的自增直至大于数组的 length 跳出循环。所以也无法删除自身进行index重置,先看一个简单例子:

let arr = [1,2,3,4]arr.forEach((item, index) => {    console.log(item); // 1 2 3 4    index++;});

index不会随着函数体内部对它的增减而发生变化。在实际开发中,遍历数组同时删除某项的操作十分常见,在使用forEach删除时要注意。

for 循环可以控制循环起点

如上文提到的 forEach 的循环起点只能为0不能进行人为干预,而for循环不同:

let arr = [1, 2, 3, 4],    i = 1,    length = arr.length;for (; i < length; i++) {    console.log(arr[i]) // 2 3 4};

那之前的数组遍历并删除滋生的操作就可以写成

let arr = [1, 2, 1],    i = 0,    length = arr.length;for (; i < length; i++) {    // 删除数组中所有的1    if (arr[i] === 1) {        arr.splice(i, 1);        //重置i,否则i会跳一位        i--;    };};console.log(arr); // [2]//等价于var arr1 = arr.filter(index => index !== 1);console.log(arr1) // [2]

for循环和forEach的性能区别

在性能对比方面我们加入一个 map 迭代器,它与 filter 一样都是生成新数组。

对比 for forEach map 的性能在浏览器环境中都是什么样的:

性能比较:for > forEach > map 在chrome 62 和 node.js v9.1.0环境下:for 循环比 forEach 快1倍,forEachmap 快20%左右。

原因分析for:for循环没有额外的函数调用栈和上下文,所以它的实现最为简单。

forEach:对于forEach来说,它的函数签名中包含了参数和上下文,所以性能会低于 for 循环。

mapmap 最慢的原因是因为 map 会返回一个新的数组,数组的创建和赋值会导致分配内存空间,因此会带来较大的性能开销。

如果将map嵌套在一个循环中,便会带来更多不必要的内存消耗。

当大家使用迭代器遍历一个数组时,如果不需要返回一个新数组却使用 map 是违背设计初衷的。

关于“es6中for和foreach的区别有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: es6中for和foreach的区别有哪些

本文链接: https://lsjlt.com/news/344145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • es6中for和foreach的区别有哪些
    这篇文章主要介绍“es6中for和foreach的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6中for和foreach的区别有哪些”文章能帮助大家解决问题。区别:1、forEach...
    99+
    2023-07-04
  • es6中map和foreach有哪些区别
    本篇内容主要讲解“es6中map和foreach有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6中map和foreach有哪些区别”吧! ...
    99+
    2024-04-02
  • php中for和foreach的区别有哪些
    小编给大家分享一下php中for和foreach的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么用php是一个嵌套的缩写名称,是英文超级文本...
    99+
    2023-06-14
  • foreach和for循环的区别有哪些
    这篇文章主要讲解了“foreach和for循环的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“foreach和for循环的区别有哪些”吧!区别:1、for通过索引来循环遍历每一个数...
    99+
    2023-07-04
  • es6和commonJs的区别有哪些
    这篇文章主要介绍了es6和commonJs的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6和commonJs的区别有哪些文章都会有所收获,下面我们一起来看看吧。一、export语句的区别:ES6...
    99+
    2023-07-05
  • es6中filter和map的区别有哪些
    今天小编给大家分享一下es6中filter和map的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们...
    99+
    2024-04-02
  • es6中let和const的区别有哪些
    这篇文章主要介绍“es6中let和const的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6中let和const的区别有哪些”文章能帮助大家解决问题...
    99+
    2024-04-02
  • es6中let和var的区别有哪些
    本篇内容介绍了“es6中let和var的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • es6中map和object的区别有哪些
    本篇内容介绍了“es6中map和object的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区别:1、Map的键可以是任意值,而O...
    99+
    2023-07-04
  • ts和es6有哪些区别
    这篇文章将为大家详细讲解有关ts和es6有哪些区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。区别:1、TS是一种免费的开源编程语言,由微软开发和维护;而...
    99+
    2024-04-02
  • typescript和es6有哪些区别
    本文小编为大家详细介绍“typescript和es6有哪些区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“typescript和es6有哪些区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。区别:1、type...
    99+
    2023-07-05
  • es6中find和filter有哪些区别
    这篇“es6中find和filter有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2024-04-02
  • es6的set和map的区别有哪些
    今天小编给大家分享一下es6的set和map的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • Java中for与foreach的区别
    目录(1)遍历元素(2)删除元素(3)修改元素(4)foreach修改元素属性总结之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说...
    99+
    2024-04-02
  • java中for和foreach的区别是什么
    在Java中,for循环和foreach循环(也称为增强for循环)是两种不同的循环方式。 for循环: for循环是一种传统的循...
    99+
    2024-04-02
  • es5和es6的继承有哪些区别
    这篇“es5和es6的继承有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es5和...
    99+
    2024-04-02
  • JS中for,for...in,for...of和forEach的区别和用法实例
    for循环 基本语法格式:  for(初始化变量;条件表达式;操作表达式){         &n...
    99+
    2024-04-02
  • es6中let与var的区别有哪些
    这篇文章主要介绍“es6中let与var的区别有哪些”,在日常操作中,相信很多人在es6中let与var的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”es6中le...
    99+
    2024-04-02
  • es5和es6作用域的区别有哪些
    本文小编为大家详细介绍“es5和es6作用域的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“es5和es6作用域的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
  • es6与node的区别有哪些
    今天小编给大家分享一下es6与node的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作