【js篇】for...in与 for...of 的区别:前端开发中的迭代器选择

在 JavaScript 中,for...infor...of 都是用于遍历数据结构的循环语句,但它们的应用场景和行为有显著差异。理解两者的区别对于编写高效、可维护的代码至关重要。


✅ 一句话总结

for...in 用于遍历对象的可枚举属性名(键) ,适合处理普通对象;而 for...of 用于遍历实现了 Symbol.iterator 接口的可迭代对象的值,适用于数组、字符串、Map、Set 等。


✅ 一、for...in 循环

🔹 语法

javascript 复制代码
for (variable in object) {
  // 执行语句
}

🔹 特点

  • 遍历对象的所有可枚举属性(包括原型链上的);
  • 返回的是属性名(字符串),不是值;
  • 主要用于普通对象(Plain Object) 的遍历;

🔹 示例

javascript 复制代码
const obj = { a: 1, b: 2, c: 3 };

for (let key in obj) {
  console.log(key);        // 输出: a, b, c
  console.log(obj[key]);   // 输出: 1, 2, 3
}

🔹 注意事项

  1. 会遍历原型链上的可枚举属性
javascript 复制代码
Object.prototype.extra = 'extra';

for (let key in obj) {
  console.log(key); // a, b, c, extra
}

✅ 建议使用 hasOwnProperty() 过滤:

javascript 复制代码
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]);
  }
}
  1. 不推荐用于数组索引遍历
    • 虽然可以遍历数组,但顺序可能不稳定;
    • 可能会遍历到手动添加的非数字属性;
javascript 复制代码
const arr = [10, 20, 30];
arr.name = 'numbers';

for (let i in arr) {
  console.log(i); // 0, 1, 2, name(包括非索引属性)
}

✅ 二、for...of 循环

🔹 语法

javascript 复制代码
for (variable of iterable) {
  // 执行语句
}

🔹 特点

  • 遍历实现了 [Symbol.iterator]() 方法的可迭代对象
  • 返回的是元素的值,不是键;
  • 适用于:ArrayStringMapSetarguments、NodeList 等;

🔹 示例

javascript 复制代码
const arr = [10, 20, 30];

for (let value of arr) {
  console.log(value); // 输出: 10, 20, 30
}

const str = "hello";
for (let char of str) {
  console.log(char); // h, e, l, l, o
}

const map = new Map([['a', 1], ['b', 2]]);
for (let [key, value] of map) {
  console.log(key, value); // a 1, b 2
}

🔹 自定义对象也可使用 for...of

只要对象实现了 Symbol.iterator 接口:

javascript 复制代码
const myIterable = {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
};

for (let value of myIterable) {
  console.log(value); // 1, 2, 3
}

✅ 三、核心区别对比表

特性 for...in for...of
遍历目标 对象的可枚举属性名(键) 可迭代对象的
适用类型 普通对象(Object) 数组、字符串、Map、Set、arguments、NodeList 等
是否遍历原型链
返回内容 属性名(字符串) 元素值
是否支持 break/continue
是否依赖 Symbol.iterator

✅ 四、常见误用与最佳实践

❌ 错误用法:用 for...in 遍历数组值

javascript 复制代码
// ❌ 不推荐
for (let i in arr) {
  console.log(arr[i]);
}

✅ 推荐使用:

javascript 复制代码
// ✅ 推荐
for (let value of arr) {
  console.log(value);
}

// 或使用数组方法
arr.forEach(value => console.log(value));

✅ 正确使用场景总结

数据类型 推荐循环方式
普通对象 {} for...in + hasOwnProperty
数组 [] for...offorEachmap
字符串 for...of
Map / Set for...of
arguments / NodeList for...of

✅ 五、一句话总结

for...in 遍历对象的 ,用 for...of 遍历可迭代对象的。选择正确的工具,让代码更清晰、更安全。


💡 拓展知识

🔹 如何判断一个对象是否可迭代?

javascript 复制代码
function isIterable(obj) {
  return obj != null && typeof obj[Symbol.iterator] === 'function';
}

isIterable([1, 2, 3]); // true
isIterable('hello');   // true
isIterable({});        // false

🔹 for...of 背后的机制

for...of 本质上是调用对象的 Symbol.iterator 方法,获取一个迭代器(Iterator),然后不断调用 .next() 方法直到 done: true

相关推荐
QQ1__8115175158 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态8 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子8 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室8 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI8 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing8 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者8 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册8 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李8 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢8 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web