JavaScript中for...in 和 for...of 的区别

for in 和 for of 的区别 阅读详情

for…in 和 for…of 的区别是什么❓

先贴一个mdn上对于 for…in 和 for…of 的解释:
在这里插入图片描述

for…in

for…in 比较容易理解,用于迭代对象的可枚举字符串属性(包括原型链上的可枚举字符串属性),直接上 Demo:

const object1 = {
  1: 44, 
  [Symbol.for('property4')]: 45
};

object1.__proto__.say = () => {}

Object.defineProperties(object1, {
  property1: {
    value: 42,
    writable: true,
  },
  property2: {
    value: 43,
    enumerable: true,
  },
});

for (let name in object1) {
  console.log(name)
}
// 1 [object String]
// property2 [object String]
// say [object String]

打印结果只有 ‘1’ 和 ‘property2’ 和 'say’这三个属性,逐个分析:

  • 1 作为对象的属性时默认会被转为 string 类型,且通过对象字面量方式定义的属性,默认为可枚举属性(enumerable 为 true);
  • Symbol.for(‘property4’) 未打印,是因为 Symbol 类型不是字符串类型,因此 for…in 无法迭代;Symbol 类型的属性不会出现在for…in、for…of 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。需要通过Object.getOwnPropertySymbols()方法,可以获取指定对象的所有 Symbol 属性名。
  • property1 属性属于字符串类型,但在数据描述中未显示定义enumerable,默认为 false,为不可枚举属性,因此 for…in 无法迭代;(如果你想要所有以字符串为键(不包括 Symbol)的自有属性(不包括原型链),包括不可枚举的属性,可以使用 Object.getOwnPropertyNames()。)
  • property2 属性属于字符串类型,在数据描述中显示定义enumerable为 true,为可枚举属性,因此 for…in 可以迭代;
  • say 属性在 object1 的原型上,显示定义,可枚举;

for…of

接下来我们来看下 for…of 的解释:for…of 语句用于迭代可迭代对象定义的要进行迭代的值。
老规矩,我们先上个小 Demo:

// 继续延用 objetc1 对象
for (let value of object1) {
  console.log(value, Object.prototype.toString.call(name))
}
// TypeError: object1 is not iterable

好家伙:直接报错了,报错信息告诉我们 object1 是不可迭代的,即 object1 并不是 可迭代对象。

让我们再仔细回看下 mdn 对于 for…of 的解释:for…of 语句用于迭代可迭代对象定义的要进行迭代的值。

这里有两个重点:一是可迭代对象,二是定义的要进行迭代的值。

那么问题来了,什么是可迭代对象 呢❓

顺其而然,迭代协议 就应运而生了,符合 迭代协议 的对象就是 可迭代对象 啦。

迭代协议 具体分为两个协议:可迭代协议和迭代器协议。可迭代对象 必须同时满足这两个协议,才能成为 可迭代对象。

在这可以先跟大家通俗的简单介绍一下这两个协议:

  • 【可迭代协议】可以简单理解为是否有 @@iterator 方法;
  • 【迭代器协议】可以简单理解为 @@iterator 方法返回的对象是否符合IteratorResult 接口类型定义(interface IteratorResult { value: any; done: boolean; })

想更多了解这两个协议的可以具体往下看:

【可迭代协议】允许 JavaScript 对象定义或定制它们的迭代行为,例如,在一个 for…of 结构中,哪些值可以被遍历到。一些内置类型同时是内置的可迭代对象,并且有默认的迭代行为,比如 Array 或者 Map,而其他内置类型则不是(比如 Object)。

要成为可迭代对象,该对象必须实现 @@iterator 方法,这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性; @@iterator 方法是一个无参数的函数,其返回值为一个符合【迭代器协议】的对象。

当一个对象需要被迭代的时候(比如被置入一个 for…of 循环时),首先,会不带参数调用它的 @@iterator 方法,然后使用此方法返回的迭代器获得要迭代的值。
回看上面的例子,为什么在 for…of 迭代 object1 的时候会报错,因为 object1 是不可迭代对象,为啥是不可迭代对象,因为该对象未实现 @@iterator 方法。

那我们该如何让 object1 成为可迭代对象呢❓我们需要在 object1对象上 实现@@iterator 方法。

使用生成器函数:
const myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
};
Object.assign(object1, myIterable)
for (let value of object1) {
  console.log(value, Object.prototype.toString.call(name))
}
// 1 '[object String]'
// 2 '[object String]'
// 3 '[object String]'
使用自定义迭代器对象(next()返回对象需要符合迭代器协议):
const myIterable = {
  data: [1, 2, 3],
  pointer: 0,
  [Symbol.iterator]() {
    return {
      next: () => {
        if (this.pointer < this.data.length) {
          return { value: this.data[this.pointer++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};
Object.assign(object1, myIterable)
for (let value of object1) {
  console.log(value, Object.prototype.toString.call(name))
}
// 1 '[object String]'
// 2 '[object String]'
// 3 '[object String]'

题外扩展:
Array.prototype.values() 方法返回一个新的数组迭代器对象,可以使用该迭代器对象迭代数组中每个元素的值,使用迭代器对象可以调用 next() 方法。
Array 内部实现了 @@iterator,因此可以直接放进 for…of 中进行迭代。
Array.prototype.values() 是 Array.prototype@@iterator 的默认实现。

Array.prototype.values === Array.prototype[Symbol.iterator]; // true
const arr = ["a", "b", "c", "d", "e"];

for (const value of arr) {
  console.log(value);
} // "a" "b" "c" "d" "e"

const iterator = arr.values();

for (const letter of iterator) {
  console.log(letter);
} // "a" "b" "c" "d" "e"

iterator.next(); // { value: undefined, done: true } 因为iterator迭代器每次都是一次性的,想要重新迭代使用必须再重新调用一个values()返回一个新的迭代器对象

for (const letter of iterator) {
  console.log(letter);
} // 不再打印
KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解 在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩 阅读详情

相关推荐

GitHub漏洞挖掘与CVE提交实战指南:从发现到编号的完整链路

GitHub开源项目是现代软件供应链的核心节点,其安全漏洞直接影响全球数百万系统的机密性、完整性与可用性。理解漏洞本质需回归CIA三元组原理,而真实可利用性依赖对协议解析层、配置加载区和依赖传递链等高危模块的精准识别。技术价值在于将模糊的‘可疑逻辑’转化为符合MITRE CVE标准的可验证事件,支撑SDL流程、威胁情报建设与供应链风险管理。典型应用场景包括甲方安全工程师推动供应商修复、独立研究者参与负责任披露,以及DevSecOps团队构建自动化风险坐标系。本文基于27次CVE提交经验,聚焦GitHub代码

weixin_33646989的博客 652

JS里的循环方法:for,forEach,for…in,for…of

for循环 for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } foreach循环 myArray.forEach(function (value) { console.log(value); }); for…in 循环 for...in循环常用于循环...

一如年少丶的博客 451

运算放大器基础1——用作比较器

运算放大器,运放,在电路设计中非常常见。在图2中,当前状态下,开关切换到0V,“正相输入”和“负相输入”都是接地,运放两个输入端电压相同。最后,调节可变电阻,使其两端电压大于3.37V,比如3.43V,作为运放正相输入,由于电压大于反相输入,LED点亮(运放输出为5V)。其次,调节可变电阻,使其两端电压小于3.37V,比如2.09V,作为运放正相输入,由于电压小于反相输入,LED不点亮。好,现在我们将0.1V电源换个方向,这样实际“正相输入”的是-0.1V,比“负相输入”的电压要低,看看输出是什么?

m0_60069998的博客 6123

深入了解JS中for...in和for...of的区别

无论是for...in还是for...of语句都是迭代一些东西。它们之间的主要区别在于它们的迭代方式。for...in语句以原始插入顺序迭代对象的可枚举属性。for...of语句遍历可迭代对象定义要迭代的数据(内建的可迭代对象定义要迭代的数据为键值,这个可迭代对象可以自己更改,不过如非必要最好不要这么做)。

热爱前端的大三在校生 8107

无人机巡检提速3倍!YOLOv8n+OpenVINO让Jetson Nano跑25FPS,还能多飞25分钟

摘要(149字): 针对无人机巡检中Jetson Nano算力不足导致的帧率低、首次推理延迟高、续航短等问题,提出YOLOv8n+OpenVINO联合优化方案: 模型轻量化:YOLOv8n参数量仅3.2M(较v8s减少71%),Jetson Nano帧率从8FPS提升至15FPS(原生),绝缘子裂纹召回率仅降3%; OpenVINO加速:AUTO模式动态分配CPU/GPU算力,首次推理延迟从500ms降至200ms,帧率再优化至25FPS; 能效提升:功耗降低40%,单次续航延长25分钟。方案已落地电力/林

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1242

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 751

请讲一讲JS中的 for...in 与 for...of (下)

对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。of 语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。还有一个区别这里提一下,for…..

lazy_tomato的博客 574

基于结构的虚拟筛选模型 gnina 从源码编译

所需要的软件安装包: 安装 CUDA 装的时候看着点,第二个要你装驱动的选择,回答N,不装。 sudo sh cuda_10.0.130_410.48_linux.run sudo vim ~/.bashrc 在 ~/.bashrc 文件最后加上 export PATH=/usr/bin:/usr/local/cuda-10.0/bin${PATH} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH} source ~

周迪新的博客 3190

js中for-in和for-of的区别

在JavaScript中,for-in和for-of是两种不同的循环结构,它们有一些重要的区别和联系。for-in循环和for-of循环是JavaScript中用于迭代对象的两种方法。它们的区别在于迭代对象的内容、类型、顺序和原理。通常,我们应该根据需要选择合适的循环方法,以提高效的迭代对象。同时,我们也需要注意到 for-in循环的一些缺陷。由于它会遍历对象的原型链,导致性能下降,而且不能保证迭代顺序,所以我们应该避免在数组和字符串上使用for-in循环。

小马甲 4020

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

OpenClaw安卓手机攻略

想在安卓手机上安装 OpenClaw,目前主要有两种主流方法:一种是使用专门的,操作简单直观;另一种是在命令行环境下进行,自由度更高。你可以根据自己的偏好和动手能力来选择。

suny8的专栏 2902

JavaScript第 10 篇,JavaScript中的for in和for of的区别(JS中的for循环,JS中的for in和for of)

⭐在JavaScript编程中,for循环是实现代码重复执行的重要工具,它能够有效地帮助开发者处理各种需要迭代的场景。从简单的计数器控制到复杂的数组操作,for循环都是不可或缺的一部分。然而,随着ECMAScript标准的发展,JavaScript引入了更多形式的循环结构,以满足不同的需求和提高代码的可读性与效率。其中,for...in和for...of循环就是这样的两种结构,它们各自针对特定类型的数据结构提供了更加简洁且语义化的遍历方式。简单记录一下

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 1594

第一节:从Chat_Bot 到 AI_Agent——一个范式转换

本文系统剖析了工业级AI代理系统ClaudeCode的设计原理与工程实践。通过对比ChatBot与Agent的三个本质差异:自主循环决策vs单轮应答、环境交互vs纯文本I/O、持久状态管理vs无状态对话,揭示了构建生产级Agent系统的关键挑战。文章详细解析了ClaudeCode的五层架构设计、1800+文件组成的运行时系统,包括工具调度、权限管理、状态持久化等核心机制,并阐述了从简单API调用到完整Agent系统的演进路径。

2201_75869398的博客 69

JavaScript中 for of 和 for in 的区别?

先说结论: for...in 循环出的是 key, for...of 循环出的是 value 。 for...of 是 ES6 新引入的特性,修复了 ES5 引入的 for...in 的不足。 for...of 不能循环普通的对象,需要通过和 Object.keys() 搭配使用。 推荐在循环对象属性的时候使用 for...in ,在遍历数组的时候的时候使用 for...of 。 let ...

猫老板的豆 936

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

js里面for循环里面的of和in区别

javascr

Robert_Gm的博客 4154

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【JavaScript】for、for-in、forEach、for-of四种循环区别

Array js的Array跟我们一般所说的数组有区别,首先Array内存空间并非连续的,再者,在Array中存储的值,是Array的属性,其“索引”是字符而非数值。 for arr = ['a', 'b'] a['name'] = 'arrName' Array.prototype.fatherName = 'fatherArray' for(let i=0; i<arr.length; ...

weixin_44794704的博客 564

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JS中for in和for of的区别

for in和for of是JavaScript中常用的遍历方法,但它们的应用场景和遍历对象有所不同。for in主要用于遍历对象的属性名或数组的索引,通过对象名[key]或数组名[key]访问对应的属性值或数组元素。而for of则用于遍历数组的值或字符串的每个字符,直接获取元素值。例如,for in遍历对象时输出属性名和值,遍历数组时输出索引和元素;for of遍历数组或字符串时直接输出元素或字符。选择合适的方法可以提高代码的可读性和效率。

2301_76459194的博客 2032

js中 for in 和 for of 的区别

js中 for in 和 for of 的区别

weixin_44576693的博客 1754

[乐意黎原创]JS里的for…in和for…of的用法与区别

for...in 循环 for...in 语句用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。 for...in 语句用于对数组或者对象的属性进行循环操作。 for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。 for (varia...

打杂人-aerchi 6万+

JavaScript 中 for in 和for of的区别

重点内容 for in 取 key; for of 取 value for of 只能用于数组遍历,for in还可以用于对象属性的遍历 eg, 1. 遍历数组: let array = [1,2,3,'lynn','Lanny'] console.log('for of: ') for (let value of array){ console.log(value); } c...

奋斗的小绿萝 4029

JavaScript 中for...in和for...of循环的原理区别,在遍历对象和数组时分别如何使用

它们就像是两个不同的小帮手,能帮你在对象和数组里溜达溜达,找找里面装的东西,但它们的工作方式可不一样哦。循环在遍历数组时,拿到的是索引,而且它还可能会遍历到数组原型链上的可枚举属性,所以一般不建议用它来遍历数组。因为它会遍历对象自身的可枚举属性以及原型链上的可枚举属性,能把对象里的属性名一个一个揪出来。循环会依次把对象的属性名和数组的索引找出来,然后你就能根据这些找到对应的值啦。循环去遍历一个对象时,它会把对象里的每个属性名一个一个地揪出来,让你能对每个属性做点儿啥。循环就像有礼貌的客人,直接拿值。

前端大白话 1075

javascript中for of和for in的区别?

先说结论: 1. 推荐在循环对象属性的时候,使用for…in,在遍历数组的时候的时候使用for…of。 2. for…in循环出的是key,for…of循环出的是value 3. 注意,for…of是ES6新引入的特性。修复了ES5引入的for…in的不足 4. for…of不能循环普通的对象,需要通过和Object.keys()搭配使用 假设我们要遍历一个数组的value let aArray = ['a',123,{a:'1',b:'2'}] 使用for…in循环: for(let index in

qq_46159864的博客 268

JS for in 与 for of 的区别

for in 是ES5标准,遍历的是key(可遍历对象,数组和字符串的key) for of 是ES6标准,遍历的是value(可遍历对象,数组和字符串的value) 一、for in for in 用来循环数组不是一个合适的选择 ,使用for...in可以遍历数组,但会存在以下问题: index索引为字符串型数字(数字,非数字),不能进行集合运算 遍历顺序有可能不是按照实际数组的内部顺序(可能按照随机顺序) 使用for-in会遍历数组所有的可枚举属性,包括原型。原型方法method和name属

qq_45954420的博客 4623

javascript 中 for in 和 for of 的区别

for in 和 for of 的区别

一点一滴滴 488

js for in 和for of的区别

参考文档    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450082788640f82a480be8481a8ce8272951a40970000 for  in  便历出来的是属性 for of 遍历的是value  手动给对象添加属性后, fo

cominglately的博客 2万+
上一篇: window.performance.timing属性详解
下一篇: JS中的对象迭代
前端攻城狮️
博客等级 码龄7年 73粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值