for in 循环详解

2023-11-15

for…i 循环的作用

for...in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性,包括继承的可枚举属性。

  • for...in 是为遍历对象属性而构建的,不建议与数组一起使用
  • 在处理有 key-value 数据,用于获取对接的 key,也就是获取键值
  • 只遍历可枚举属性。像 ArrayObject 使用内置构造函数所创建的对象都会继承自 Object.prototypeString.prototype 的不可枚举属性,这种是无法遍历的

语法:for (variable in object)

  • variable:在每次迭代时,variable 会被赋值为不同的属性名。
  • object:非 Symbol 类型的可枚举属性被迭代的对象。

使用示例

遍历一个带有 Symbol 的对象

const obj = {
  a: 'a',
  b: 'b',
  c: 'c',
  [Symbol('a')]: '我是 symbol',
}

for (let key in obj) {
  console.log('obj.' + key + ' = 我是' + obj[key])
}

结果如图:Symbol 并没有出现在遍历的结果当中

遍历带有不可枚举的属性

如下面的代码所示,我们在 obj 上加了两个属性,enumerableTrue 可枚举,notEnumerableTrue 不可枚举

const obj = {
  a: 'a',
  b: 'b',
  c: 'c',
  [Symbol('a')]: '我是 symbol',
}

Object.defineProperty(obj, 'enumerableTrue', {
  value: 'enumerableTrue',
  enumerable: true
})

Object.defineProperty(obj, 'notEnumerableTrue', {
  value: 'not-enumerableTrue',
  enumerable: false
})

for (let key in obj) {
  console.log('obj.' + key + ' = 我是' + obj[key])
}

结果如图所示:notEnumerableTrue 不可枚举的属性,没有在遍历的结果中

继承的枚举示例

如下代码,我们创建了一个构造函数 TestProtoType,并在其中声明了一个 name 属性,并将 TestProtoType 构造函数的原型绑定到了 obj 对象

const obj = {
  a: 'a',
  b: 'b',
  c: 'c',
  [Symbol('a')]: '我是 symbol',
}

Object.defineProperty(obj, 'enumerableTrue', {
  value: 'enumerableTrue',
  enumerable: true
})

Object.defineProperty(obj, 'notEnumerableTrue', {
  value: 'not-enumerableTrue',
  enumerable: false
})

function TestProtoType () {
  this.name = 'wfly'
}

TestProtoType.prototype = obj

const testProtoTypeObj = new TestProtoType();

for (let key in testProtoTypeObj) {
  console.log('testProtoTypeObj.' + key + ' = 我是' + testProtoTypeObj[key])
}

console.log('=======');

for (let key in testProtoTypeObj) {
  if (testProtoTypeObj.hasOwnProperty(key)) {
    console.log('testProtoTypeObj.' + key + ' = 我是' + testProtoTypeObj[key])
  }
}

console.log(testProtoTypeObj);

结果如图所示:对构造函数的实例进行遍历时,会输出其原型上的可枚举属性。如果只想输出是对象本身的使用 hasOwnProperty 即可

遍历数组

使用 for in 去遍历数组,得到的 key 就是数组的索引 index

const arr = [{ name: 'wfly' }, { name: 'fnn' }]
for (let key in arr) {
  console.log('obj.' + key + ' = 我是' + JSON.stringify(arr[key]))
}

for…in 如何中断循环

for in 中可以使用 break 或者 continue 去中断循环,不可以直接用 return 去中断循环

const obj = {
  a: 'a',
  b: 'b',
  c: 'c',
  [Symbol('a')]: '我是 symbol',
}

// 循环中断
for (let key in obj) {
  if (key === 'b') {
    break
  }
  console.log('obj.' + key + ' = 我是' + obj[key])
}

console.log('=============');

for (let key in obj) {
  if (key === 'b') {
    continue
  }
  console.log('obj.' + key + ' = 我是' + obj[key])
}

console.log('=============');

return 中断

return 不能直接中断循环,必须放在函数中

function test () {
  const obj = {
    a: 'a',
    b: 'b',
    c: 'c',
    [Symbol('a')]: '我是 symbol',
  }
  for (let key in obj) {
    if (key === 'b') {
      return
    }
    console.log('obj.' + key + ' = 我是' + obj[key])
  }
}

test()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for in 循环详解 的相关文章

随机推荐

  • 21 存在重复元素

    题目 题解 方法1 排序 如果有相邻相等的就有重复的 但O n 是nlogn 因为对数组排序呀 class Solution public bool containsDuplicate vector
  • nodejs-post文件上传原理详解

    转自 http cnodejs org topic 4f16442ccae1f4aa270010ad 基础知识 浅谈HTTP中Get与Post的区别 HTTP请求报文格式 简单介绍下 如下图 其中请求报文中的开始行和首部行包含了常见的各种信
  • 服务器里面的文件怎么传送,FTP服务器怎么传送局域网文件

    现如今 网络的使用已经十分普遍 同时也会有各种各样的局域网知识出现 比如 FTP服务器怎么传送局域网文件 学习啦小编在这里为大家详细介绍 使用局域网传送文件的朋友也许都遇过这样的悲事 自己在拷贝移动一个大的文件的时候 在最后几分钟就会完成
  • 企业数字化转型痛点,低代码平台如何解决?

    编者按 数字化能力建设整体尚处于初级阶段 虽然数字技术的发展已经从互联网 大数据时代迈入人工智能时代 但很多企业的数字化转型总体表现并不理想 那么面对数字化转型的痛点 低代码平台是如何解决的呢 来跟小编一起往下看 关键词 可视化开发 API
  • There is no ‘Animation’ attached to the “Player” game object

    There is no Animation attached to the Player game object 在照着龚老师的Unity3D投篮游戏视频教程练习时 遇到这个错误提示 我知道意思 就是player模型导入时 动画没有正确的加
  • Apache logs目录下找不见access.log文件解决办法

    Apache logs目录下找不见access log文件解决办法 原文链接请点击 https www cnblogs com ruoli s p 14561391 html 今天在做测试的时候 忽然发现 咦 我的apache服务器logs
  • 学习java和html必须要知道的英文单词(入门单词,包括C#)

    以前听说学习编程不需要记太多的英语单词 但是我在学习的时候还是碰到许多重要的编程单词 这里给大家稍微整理了一下 非常适合我们这些萌新 一 java入门基础学习单词 第一篇 public p bl k 公开 static st t k 静态
  • java代码审查

    一 概述 代码审查 Code Review 是消灭Bug最重要的方法之一 这些审查在大多数时候都特别奏效 由于代码审查本身所针对的对象 就是俯瞰整个代码在测试过程中的问题和Bug 并且 代码审查对消除一些特别细节的错误大有裨益 尤其是那些能
  • 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏 基于Py Tk 今天翻出来 然后重新整理 并且发布出来 供大家参考学习 自己看CSDN里有很多了类似的游戏代码 虽然代码逻辑上大同小异 但每个开发者都有自己独特的开发个性和习惯 这并无优劣 而且都可以从代码中都可以
  • Hive 调优总结2

    无需MapReduce 在hive default xml中hive fetch task conversion默认是more 老版本是minimal 该属性改为more后 在全局查找 字段查找 limit查找等都不走mapreduce E
  • 使用ffmpeg将视频文件(Mp4)转换为.ts格式文件,并通过nginx代理在前端访问

    废话不多说 直接上代码 1 编写工具类 Mp4ToTsUtils import java io BufferedReader import java io File import java io IOException import jav
  • 来了,MyBatisPlus的join联表查询!

    来源 juejin cn post 7110405284811522085 使用方法 安装 使用 核心类 MPJLambdaWrapper和MPJQueryWrapper MPJLambdaWrapper用法 MPJQueryWrapper
  • At32f421/gd32f103c6/stmf030

    ADF16ST V5 0遥控器 nf2401 bk2425 2 4g 连接 单片机 spi2 pb port bk3431 蓝牙 连接 单片机 uart3 bk2451 连接单片机 uart1 Q20 A77E BK343 供电控制 R61
  • 分布式系统理论

    说到分布式系统 不得不说集中式系统 传统集中式系统中整个项目所有的东西都在一个应用里面 一个网站就是一个应用 当系统压力较大时 只能横向扩展 增加多个服务器或者多个容器去做负载均衡 避免单点故障而影响到整个系统 集中式最明显的优点就是开发
  • 未授权访问的MongoDB修复方案

    修复方法 1 不要把MongoDB服务器部署在互联网上或者DMZ 开启MongoDB的授权访问 编辑 etc mongo conf 文件 找到 auth true 去掉注释 创建用户管理员 另外再连接MongoDB的时候 public cl
  • Mysql(9)_视图

    1 视图是什么 首先 视图是虚拟的表 是不存在的 若使用jdbc连接它 是会报错的 它本质上是sql语句 其次 物理表是真实存在的表 占用内存空间 视图没有实际的物理记录 而表有 视图 view 是在基本表之上建立的表 它的结构 即所定义的
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视
  • 字典序及1-n之间的数按字典序排列

    今天在刷LeetCode的时候遇见了一道题 题的要求是 给你一个整数 n 按字典序返回范围 1 n 内所有整数 你必须设计一个时间复杂度为 O n 且使用 O 1 额外空间的算法 开始以为是简单的输出 提交后发现与答案相差甚多 看评论后方了
  • xmind右键无法创建

    xmind右键菜单无法创建 前言 安装xmind 设置鼠标右键菜单 验证是否修复成功 后语 前言 前言 hello 不知大家在安装完xmind后 回到桌面后是否可以右键新建xmind文件 如果不行的话 那我就希望这篇文章能帮到你啦 安装xm
  • for in 循环详解

    for i 循环的作用 for in 语句以任意顺序迭代一个对象的除 Symbol 以外的可枚举属性 包括继承的可枚举属性 for in 是为遍历对象属性而构建的 不建议与数组一起使用 在处理有 key value 数据 用于获取对接的 k