首页/文章/javascript

比较for、for...in、for...of、forEach的区别

2024-12-24
18107 分钟
...

目录

前言

一、四种循环

1、for循环

2、for...in循环

3、for...of循环

4、forEach方法

二、比较

1、优缺点

2、总结


前言

在比较之前我们先了解两个概念:

  • 迭代(iterate),指的是按照某种顺序反复多次执行一段程序,通常会有明确的终止条件。
  • 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。

一、四种循环

1、for循环

for语句是一种先测试循环语句,(即先检测退出条件,再执行循环体内的代码.)

  • 语法:

for(初始化变量;条件表达式;操作表达式){

循环体语句;
       }

(1)三个表达式都可以省略,但是表达式之间的分号不能省略。都省略的话就创建了一个无穷循环。

for(;;){  //无穷循环

循环体语句

}

(2)初始化变量:给循环变量、其他变量进行初始化。

(3)条件表达式:控制循环体语句是否执行。如果只包含条件表达式for循环就变成while循环。

(4)操作表达式:使循环趋向结束的语句 。

  • 用法:

(A) for循环用于遍历数组,不可直接遍历对象。(需要用Object.key()属性转化)

//for循环遍历数组
var arr = [1,2,3,4,5]
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);    
}
//for循环遍历对象
var obj = {a:1,b:2,c:3}  //对象
 
var obj2 = Object.keys(obj) //用Object.key()属性转化为数组类型
console.log(obj2);
 
for (let i = 0; i < obj2.length; i++) {
    console.log(obj2[i]+':'+obj[obj2[i]]);    
}

(B) 能使用break,continue语句跳出循环。

var arr = ['a','b','c','d','e']
for (let i = 0; i < arr.length; i++) {
    if(i===1){
        console.log('跳过索引为1的元素');
        continue;
    }
    console.log(arr[i]);
}

var arr = ['a','b','c','d','e']
for (let i = 0; i < arr.length; i++) {
    if(i===3){
        console.log('跳出循环');
        break;
    }
    console.log(arr[i]);
}

2、for...in循环

for..in语句是一种严格的迭代语句,用于枚举对象中的非符号键属性(包括它的原型链上的可枚举属性),我们可以简单理解为它适合遍历对象。

在这里解释一下非符号键: 不是 Symbol 的键。

在任何迭代中,键为 Symbol 都会被忽略。只能使用 Object.getOwnPropertySymbols 获取所有的 Symbol 键。

  • 语法:

for(var 变量  in  数组名或集合名)  //变量中存放的数组或集合的索引
         {
            数组名[变量]
         }

  • 用法:
var person = {name:'张三',age:22,gender:'男'}
 
for(var index in person){
    console.log(index+person[index]);
}

3、for...of循环

for...of语句是一种严格的迭代语句,用于遍历可迭代对象的元素。

语法:

for(var 变量 of 数组名或集合名) //变量中存放的是数组或集合中的元素
         {
             console.log(变量);
         }

  • 用法:

遍历数组:

var person = ['金','木','水','火','土']
 
for(var value of person){
    console.log(value);
    
}

遍历对象(无法直接遍历对象):

var person = {name:'张三',age:22,gender:'男'}
var obj = Object.keys(person);  //for...of也不能直接遍历对象,跟for一样需要转换
for(var value of obj){
    console.log(value+person[value]);
}

4、forEach方法

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

  • 语法:

arr.forEach(function(k){  //依次从数组中取出元素放在k中,然后将k作为参数传递给函数
         console.log(k);
       })

注意: forEach() 对于空数组是不会执行回调函数的。

forEach() 本身是不支持的 continue 与 break 语句的,我们可以通过 some 和 every 来实现。

  • 用法:

遍历数组:

var arr = ['金','木','水','火','土']
arr.forEach(function (value) {  //参数1:value---正在遍历的元素
    console.log(value);
})
 
arr.forEach(function (value,index) { //参数2:index---元素的索引
    console.log(index);
})
 
arr.forEach(function (value, index,Array) { //参数3:Array---正在遍历的数组
    console.log("Array="+arr);
})

二、比较

1、优缺点

for:

  • 优点:程序简洁,结构清晰,循环初始化,循环变量化和循环条件位置突出。
  • 缺点:结构比while循环复杂,容易出编码错误。

for...in:

  • 优点:可以遍历数组的键名,遍历对象简洁方便。
  • 缺点:返回可枚举的属性的顺序因浏览器而异。

for...of:

  • 优点:避免了for...in的所有缺点,支持break,continue,return。支持遍历map,object,array,set string等。
  • 缺点:不适用于处理原有的原生对象。

forEach:

  • 优点:便利的时候更加简洁,效率和for循环相同,不用关心集合下标的问题,减少了出错的效率。
  • 缺点:不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据。

2、总结

(1) for循环、for...in循环和for..of循环能中断循环(使用break,continue);forEach不可以。

(2) for循环、for..of循环和forEach不能直接遍历对象,for...in可以。

(3) for...in遍历的是数组的索引,for...of遍历数组元素值。

(4) for...of不能循环普通的对象,需要通过和Object.keys()搭配使用。

(5) 如果for...in要迭代的变量是null或undefined,则不执行循环体。

(6) **forEach(value,index,Array)**不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据。被调用时,不会改变原数组,也就是调用它的数组。

(7**)** forEach与for当循环遍历为空的数组时,forEach会跳过为空的值,for不会跳过为空的数据,会直接显示undefined。两者都能识别出NULL。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-10
手把手教你实现一个EventEmitter
你是不是也遇到过这种情况:代码里各种事件监听和触发,回调函数套了一层又一层,最后自己都理不清哪个事件先触发、哪个后触发了? 别担心,今天我就带你从零开始实现一个自己的事件触发器(EventEmitter),让你彻底掌握事件驱动的精髓,代码清晰度直接提升200%! 为什么要懂EventEmitter? 先说说为什么我们要关心这个。Node.js的核心就是事件驱动,比如文件读写、网络请求,都是通过事件来处理的。不会EventEmitter,...
学习面试
javascript2025-08-09
Web Worker 多线程魔法
你是否曾遇到过网页因为复杂计算而卡顿的情况?今天,让我们一起探索Web Worker的神奇世界,看看如何用多线程技术解决性能瓶颈,并实现流畅的图片压缩功能! 为什么需要Web Worker? 想象一下,你在一个繁忙的餐厅里,只有一位服务员(主线程)负责点餐、上菜、结账所有工作。当客人突然暴增时,这位服务员就会手忙脚乱,其他客人只能干等着… 这就是JavaScript的现状—— 单线程 !所有任务都在一个线程中排队执行,一旦遇到复杂计算(...
学习面试
javascript2025-08-07
🌐AST抽象语法树
AST 是前端开发中一个非常重要的概念,它就像是代码的“编译器”,能够帮助我们理解和操作代码。本文将深入探讨 AST 的原理和应用,带你从零开始了解 AST。 一、什么是 AST? AST(抽象语法树)是一种树形结构,用于表示程序代码的语法结构。它将代码分解为一系列的节点,每个节点代表代码中的一个元素,如变量、函数、表达式等。AST 是编译器和解释器的基础,也是代码分析和转换的关键工具。 1\. AST 的结构 AST 的结构通常包括以...
学习面试
javascript2025-08-05
打字机效果是如何实现的
分析效果 使用 AI 对话的时候,文字是一个字一个字蹦出来的?它不是等所有内容生成完毕后一次性展示,而是以一种流畅、实时的“打字机”效果呈现,这种体验的背后,隐藏着一种高效的Web技术。它就是 服务器推送事件(Server Sent Events,简称 SSE) 什么是 SSE 从根本上说,SSE 是一种允许服务器 单向 、 持续 地向客户端(浏览器)推送数据的Web技术。 可以把它想象成一个 电台广播 : 服务器 是广播电台,持续不断...
学习面试
javascript2025-08-04
Promise 从原理到实现
前言 是 异步编程的核心概念之一,它为我们提供了一种更优雅的方式来处理异步操作。 本文将全面剖析 的工作原理,并逐步实现一个符合 规范的 。 正文 一、Promise 基础概念 代表一个异步操作的最终完成(或失败)及其结果值。它有 种状态: 1. pending : ,既不是成功,也不是失败状态 2. fulfilled :意味着操作 完成 3. rejected :意味着操作 状态一旦改变就不能再变,只能从 变为 ,或从 变为 。 二...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录