在遍历对象属性时,for...in和for...of有什么区别?

简介: 在遍历对象属性时,for...in和for...of有什么区别?

在 JavaScript 中,for...infor...of 是两种不同的遍历方式,它们在处理对象属性时存在本质区别,具体差异如下:

一、遍历目标与返回值

特性 for...in for...of
遍历目标 遍历对象的可枚举属性名(包括索引、自定义属性) 遍历可迭代对象的元素值无法直接遍历普通对象
返回值类型 字符串(属性名) 具体元素值(需对象实现迭代器接口)
原生支持对象 普通对象、数组、字符串等 数组、Set、Map、String、DOM集合等可迭代对象

二、核心区别详解

1. 遍历对象的方式不同

  • for...in 的使用场景
    for...in 专门用于遍历对象的属性名,返回的是字符串类型的属性键(包括数组的索引)。

    const obj = {
          name: '豆包', age: 2, skill: '编程' };
    for (const key in obj) {
         
      console.log(key);  // 输出: "name", "age", "skill"
    }
    
    // 数组场景(索引作为属性名)
    const arr = ['a', 'b', 'c'];
    for (const index in arr) {
         
      console.log(index);  // 输出: "0", "1", "2"(字符串类型)
    }
    
    AI 代码解读
  • for...of 无法直接遍历普通对象
    for...of 只能遍历实现了迭代器接口(Symbol.iterator)的对象,普通对象默认没有迭代器,直接使用会报错。

    const obj = {
          name: '豆包', age: 2 };
    for (const value of obj) {
         
      // 报错:Uncaught TypeError: obj is not iterable
    }
    
    AI 代码解读

    若要使用 for...of 遍历对象属性,需先将对象转换为可迭代结构(如通过 Object.entries() 获取键值对数组):

    const obj = {
          name: '豆包', age: 2 };
    for (const [key, value] of Object.entries(obj)) {
         
      console.log(key, value);  // 输出: "name" "豆包", "age" 2
    }
    
    AI 代码解读

2. 对原型链和属性特性的处理

  • for...in 会遍历原型链上的可枚举属性
    若对象继承了原型链上的属性,for...in 会一并遍历,需通过 hasOwnProperty() 过滤:

    Object.prototype.test = '原型属性';
    const obj = {
          data: '自定义属性' };
    
    for (const key in obj) {
         
      console.log(key);  // 输出: "data", "test"(包括原型属性)
    }
    
    // 过滤原型属性
    for (const key in obj) {
         
      if (obj.hasOwnProperty(key)) {
         
        console.log(key);  // 仅输出: "data"
      }
    }
    
    AI 代码解读
  • for...of 只遍历自身元素值
    由于 for...of 依赖迭代器,而迭代器仅遍历对象自身的元素(如数组元素、Map 的键值对),不涉及原型链:

    Array.prototype.push('原型元素');
    const arr = [1, 2];
    
    for (const item of arr) {
         
      console.log(item);  // 输出: 1, 2(不包含原型链上的"原型元素")
    }
    
    AI 代码解读

3. 语法与使用场景对比

  • for...in 的典型场景

    • 遍历普通对象的属性名(如配置项、字典数据)。
    • 遍历数组的索引(但更推荐用 for...offorEach 处理数组元素)。
      // 遍历配置对象
      const config = {
             
      env: 'production',
      debug: false,
      port: 8080
      };
      for (const key in config) {
             
      console.log(`${
               key}: ${
               config[key]}`);
      }
      
      AI 代码解读
  • for...of 的典型场景

    • 遍历数组、Set、Map 等可迭代对象的元素值。
    • 需要直接操作元素值并支持 break/continue 中断循环的场景。
      // 遍历数组并中断
      const numbers = [1, 3, 5, 7];
      for (const num of numbers) {
             
      if (num > 5) break;
      console.log(num);  // 输出: 1, 3
      }
      
      AI 代码解读

三、总结与选择建议

场景 推荐方法 原因
遍历普通对象的属性名 for...in 直接获取属性名,需配合 hasOwnProperty() 过滤原型属性。
遍历可迭代对象的元素值 for...of 语法简洁,直接操作值,支持中断循环,不涉及原型链。
同时获取对象的键和值 Object.entries() + for...of 将对象转为 [key, value] 数组,再用 for...of 遍历,可读性更高。
处理数组索引和元素 for...of 直接获取元素值,比 for...in 更符合数组遍历的语义(索引可用 index 获取)。

注意for...in 设计初衷是为了遍历对象,而 for...of 是 ES6 引入的迭代器遍历语法,两者适用场景不同,需根据数据类型和需求选择,避免混淆使用。

目录
打赏
560
57
57
0
109
分享
相关文章
【Vite】Vite设置好了Proxy,但接口却404!解决方案来了!
前言 最近在做一个Vue3+Vite+TypeScript的项目,进行一番网上冲浪后,参考了众多🐴友的方案,配置完vite.config.ts准备开始与后端的同学开始联调,发现无论怎么样都是404,然后就开始了一步步的排查!
6175 0
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
使用 async/await 结合 try/catch 处理 Promise.reject()抛出的错误时,有什么需要注意的地方?
267 57
【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
1902 0
|
10月前
|
vue.js怎么实现全屏显示功能
【10月更文挑战第7天】
330 1
多模态LLM视觉推理能力堪忧,浙大领衔用GPT-4合成数据构建多模态基准
【9月更文挑战第2天】浙江大学领衔的研究团队针对多模态大型模型(MLLM)在抽象图像理解和视觉推理上的不足,提出了一种利用GPT-4合成数据构建多模态基准的方法。该研究通过合成数据提高了MLLM处理图表、文档等复杂图像的能力,并构建了一个包含11,193条指令的基准,涵盖8种视觉场景。实验表明,这种方法能显著提升模型性能,但依赖闭源模型和高计算成本是其局限。论文详细内容见:https://arxiv.org/pdf/2407.07053
257 10
【.NET Core】你真的了解HttpRuntime类吗
【.NET Core】你真的了解HttpRuntime类吗
140 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问