当前位置: 首页 > news >正文

for...in 和 for...of:用法、区别

1. for...in 循环

语法
for (const key in object) {// 循环体
}
用途
  • 遍历对象的可枚举属性for...in 主要用于遍历对象的可枚举属性(包括继承自原型链的属性,除非被显式屏蔽)。
  • 不推荐用于数组:虽然可以遍历数组的索引,但可能遇到以下问题:
    • 遍历顺序不保证(ES6+ 中按数字升序,但非数字键可能不按顺序)。
    • 可能遍历到非预期的原型链属性(需用 hasOwnProperty 过滤)。
示例
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {console.log(key, obj[key]); // 输出:a 1, b 2, c 3
}// 过滤原型链属性
const parent = { inheritedProp: 'foo' };
const child = Object.create(parent);
child.ownProp = 'bar';
for (const key in child) {if (child.hasOwnProperty(key)) {console.log(key, child[key]); // 输出:ownProp bar}
}
注意事项
  • 原型链属性:默认会遍历原型链上的可枚举属性,需用 hasOwnProperty 过滤。
  • 性能:在大型对象上可能比 Object.keys() + forEach 慢。

2. for...of 循环

语法
for (const item of iterable) {// 循环体
}
用途
  • 遍历可迭代对象for...of 用于遍历实现了 [Symbol.iterator] 方法的可迭代对象(如数组、字符串、MapSetNodeList 等)。
  • 直接获取值:每次迭代返回的是值(而非键或索引)。
示例
// 遍历数组
const arr = [10, 20, 30];
for (const num of arr) {console.log(num); // 输出:10, 20, 30
}// 遍历字符串
const str = 'hello';
for (const char of str) {console.log(char); // 输出:h, e, l, l, o
}// 遍历 Map
const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {console.log(key, value); // 输出:a 1, b 2
}
注意事项
  • 不可迭代对象:普通对象默认不可迭代,需手动实现 [Symbol.iterator] 或使用 Object.keys()/Object.values() 转换。
  • 性能:通常比 forEachfor 循环更高效,尤其在大型数据集上。

3. for...in vs for...of 核心区别

特性for...infor...of
遍历目标对象的可枚举属性(包括原型链)可迭代对象的值(如数组、字符串等)
返回值键(属性名)值(直接是元素值)
适用场景遍历对象属性遍历数组、字符串、MapSet
原型链属性默认包含(需过滤)不涉及原型链
性能可能较慢(需处理原型链)通常更快

4. 使用场景建议

  • for...in

    • 需要遍历对象的属性名时(如动态检查对象结构)。
    • 注意:避免用于数组,优先用 for...ofArray.prototype.forEach
  • for...of

    • 遍历数组、字符串、MapSet 等可迭代对象。
    • 需要直接操作值而非索引/键时。

5. 扩展:手动实现对象的可迭代性

若需用 for...of 遍历对象,可手动实现 [Symbol.iterator]

const obj = { a: 1, b: 2, c: 3 };
obj[Symbol.iterator] = function* () {for (const key in this) {if (this.hasOwnProperty(key)) {yield [key, this[key]]; // 返回键值对}}
};for (const [key, value] of obj) {console.log(key, value); // 输出:a 1, b 2, c 3
}

总结

  • for...in:专注于对象属性的遍历,需警惕原型链污染。
  • for...of:专注于可迭代对象的值遍历,语法简洁且性能优异。

根据实际需求选择合适的循环结构,可以显著提升代码的可读性和效率。

http://www.xdnf.cn/news/597889.html

相关文章:

  • Vue2 项目报错问题收录(持续更新...)
  • 101个α因子#21
  • 火语言UI组件--控件事件触发
  • Vaptcha 手势、轨迹验证码
  • idea常用配置 properties中文输出乱码
  • AI智慧高光谱遥感实战精修班暨手撕99个案例项目、全覆盖技术链与应用场景一站式提升方案
  • 车载软件架构 --- FLASH bootloader 设计要点
  • 随机链表的复制问题详解与代码实现
  • python学习打卡day33
  • 等离子体隐身技术和小型等离子体防御装置设计
  • 军事目标系列之迷彩作战人员检测数据集VOC+YOLO格式2755张1类别
  • C#中WSDL文件引用问题
  • 【接近平均分配箱子数量】2022-1-23
  • uni 常用api
  • 学习STC51单片机11(芯片为STC89C52RC)
  • 嵌入式软件架构规范之 - 分层设计
  • Linux终端输入有80个字符的限制处理
  • 【com.unity3d.player.UnityPlayer介绍】
  • Spring IoC 和 AOP -- 核心原理与高频面试题解析
  • 单测覆盖率和通过率的稳定性问题,以及POM文件依赖包版本一致性的挑战
  • 位运算及其算法
  • 解决wsl没代理的问题
  • 第4周_作业题_逐步构建你的深度神经网络
  • 论文解读 | 《药用真菌桑黄通过内质网应激 - 线粒体损伤诱导人宫颈癌细胞凋亡》
  • 从JDK 17到JDK 21:Java核心特性概述
  • Python之web错误处理与异常捕获
  • 【人工智能】从零到一:大模型应用开发的奇幻旅程
  • 【修改提问代码-筹款】2022-1-29
  • Qwen2.5-VL技术解读和文档解析可行性验证
  • Any类(C++17类型擦除,也称上帝类)