【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

相关推荐
veneno2 小时前
大量异步并发请求控制并发解决方案
前端
i***t9192 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
oden2 小时前
2025博客框架选择指南:Hugo、Astro、Hexo该选哪个?
前端·html
小光学长2 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
云中飞鸿3 小时前
函数:委托
javascript
小小前端要继续努力3 小时前
渐进增强、优雅降级及现代Web开发技术详解
前端
老前端的功夫4 小时前
前端技术选型的理性之道:构建可量化的ROI评估模型
前端·javascript·人工智能·ubuntu·前端框架
狮子座的男孩4 小时前
js函数高级:04、详解执行上下文与执行上下文栈(变量提升与函数提升、执行上下文、执行上下文栈)及相关面试题
前端·javascript·经验分享·变量提升与函数提升·执行上下文·执行上下文栈·相关面试题
爱学习的程序媛4 小时前
《JavaScript权威指南》核心知识点梳理
开发语言·前端·javascript·ecmascript
乐观主义现代人4 小时前
go 面试
java·前端·javascript