首页 > 其他分享 >JS中的for...in和for...of有什么区别?

JS中的for...in和for...of有什么区别?

时间:2024-09-22 22:19:40浏览次数:12  
标签:... const log 区别 console value JS key obj

你好,我是沐爸,欢迎点赞、收藏、评论和关注。

在 JavaScript 中,for...infor...of 是两种用于遍历数组(或其他可迭代对象)的循环语句,但它们之间存在显著的差异。

一、遍历数组

for…in

const arr = ['apple', 'banana', 'cherry']

for (const index in arr) {
    console.log(index, arr[index])
}
// 0 apple
// 1 banana
// 2 cherry

遍历数组的索引,访问数组元素通过 arr[index]形式。

for…of

const arr = ['apple', 'banana', 'cherry']

for (const value of arr) {
    console.log(value)
}
// apple
// banana
// cherry

遍历数组元素,不能访问索引

二、遍历对象

for...in
const obj = {
    name: '张三',
    age: 20
}

for (const key in obj) {
    console.log(key, obj[key])
}
// name 张三
// age 20

遍历对象的键(key),通过obj[key]访问属性的值。

for…of

const obj = {
    name: '张三',
    age: 20
}

for (const key of obj) {
    console.log(key)
}
// TypeError: obj is not iterable

for...of 循环默认并不支持直接遍历对象的属性。因为for...of循环是为可迭代对象(如Array, Map, Set, arguments等)设计的,这些对象都有一个[Symbol.iterator]方法。

所以,常见的做法是结合 Object.keys()Object.values或者Object.entries() 进行遍历。

const obj = {
    name: '张三',
    age: 20
}

for (const key of Object.keys(obj)) {
    console.log(key, obj[key])
}
// name 张三
// age 20

for (const value of Object.values(obj)) {
  console.log(value)
}
// 张三
// 20

for (const [key, value] of Object.entries(obj)) {
    console.log(key, value)
}
// name 张三
// age 20

另外,for…in 和 for…of 在遍历对象原型上的属性也有区别,for…in 会遍历对象原型上的属性,for…of 不会。

function Person(name, age) {
    this.name = name
    this.age = age
}

Person.prototype.say = function() {
    console.log('My Name is ' + this.name)
}

const obj = new Person('张三', 20)

for (const key in obj) {
    console.log(key, obj[key])
}
// name 张三
// age 20
// say [Function (anonymous)]

for (const key of Object.keys(obj)) {
    console.log(key, obj[key])
}
// name 张三
// age 20

说准确点,并不是 for…of 不会遍历对象原型上的属性,而是 for…of 借助的 Object.keys()Object.valuesObject.entries()方法返回的数组只包含对象自身的属性和值。

如果想让 for…in 跟 for…of 一样只遍历对象自身的属性,可使用 hasOwnProperty

for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
        console.log(key, obj[key])
    }
}

三、遍历其他类型数据

1.字符串
let str = "hello"

for (const index in str) {
    console.log(index, str[index])
}
// 0 h
// 1 e
// 2 l
// 3 l
// 4 o

for (const value of str) {
    console.log(value)
}
// h
// e
// l
// l
// o

2.Set 结构

const set = new Set(['apple', 'banana', 'cherry'])

for (const value in set) {
  console.log(value) // 这里几乎不会执行任何有用的操作,因为set没有可枚举的属性
}

for (const value of set) {
  console.log(value)
}
// 输出(顺序可能不同,因为Set是无序的):
// apple
// banana
// cherry

3.Map结构

const map = new Map([['a', 1], ['b', 2], ['c', 3]])

for (const value in map) {
  console.log(value) // 这里几乎不会执行任何有用的操作,因为map没有可枚举的属性
}

for (const [key, value] of map) {
  console.log(key, value) 
}
// 输出:  
// a 1  
// b 2  
// c 3

4.类数组arguments

function fn(a, b, c) {
    for (const index in arguments) {
        console.log(index, arguments[index])
    }
    // 0 zhangsan
    // 1 20
    // 2 男
  
    for (const value of arguments) {
        console.log(value)
    }
    // zhangsan
    // 20
    // 男
}

fn('zhangsan', 20, '男')

四、总结

通过以上示例可知,两者主要有以下区别:

  • for...in
    • 遍历对象的可枚举属性(包括原型链上的)
    • 对于数组,遍历的是索引(字符串类型)。
    • 不可遍历 Set 和 Map 结构
  • for...of
    • 遍历可迭代对象的值,直接访问值而不是键名或索引。
    • 不可直接变量对象,需要借助 Object.keys/values/entries。
    • 另外可遍历 Set 和 Map 结构

好了,分享结束,谢谢点赞,下期再见。

标签:...,const,log,区别,console,value,JS,key,obj
From: https://blog.csdn.net/m0_37943716/article/details/142444603

相关文章

  • 【接口自动化测试】jsonpath应用:提取数据、断言、接口关联
    安装命令pipinstalljsonpath表达式importjsonpathres=jsonpath.jsonpath(obj,expr)1、返回结果要么是list,要么是False2、obj 要提取的对象,应为字典类型。报文的格式是json,必须进行数据的转换, 用json.loads()将json转换成字典类型   expr jsonpath表......
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
    技术背景好多开发者跟我们做技术交流的时候,会问我们,为什么有Unity3D的RTMP|RTSP播放模块,还有RTMP推送和轻量级RTSP服务模块,为什么不去支持虚幻引擎?二者区别在哪里?本文就Unity3D和虚幻引擎之间的差异,做个大概的分析,实际上,Unity3D和虚幻引擎(UnrealEngine)在游戏开发及其他相关领域都......
  • 面试-JS异步进阶
    面试题:......
  • 视野修炼-技术周刊第102期 | js 编译运行C
    欢迎来到第102期的【视野修炼-技术周刊】,下面是本期的精选内容简介......
  • Express、Koa、Egg.js:Node.js框架的对比与选择
    摘要:本文将对比分析Express、Koa、Egg.js这三个Node.js框架的特点、优势和应用场景,帮助读者根据实际需求选择最适合的框架。引言:在现代Web开发中,Node.js框架是不可或缺的工具。Express、Koa、Egg.js是三种流行的Node.js框架,它们各自具有独特的特点和优势。本文将详细对比分析这三......
  • USB2.0 的LPM和USB3.0的LPM区别
    USB2.0和USB3.0都支持低功耗管理机制(LPM,LinkPowerManagement),但两者的实现方式和目标不同。以下是USB2.0的LPM和USB3.0的LPM之间的主要区别:1.协议版本与目的USB2.0LPM(LinkPowerManagement):在USB2.0中,LPM是对原有的挂起/恢复机制的增强。它引入......
  • fastjson反序列化漏洞
    fastjson将java中的类和json相互转化的一个工具.简单使用javabean类转jsonpublicclassFastjsonTest{publicstaticvoidmain(String[]args){Useruser=newUser();Stringjson=JSON.toJSONString(user);System.out.println(json);......
  • How to get the exact duration of an audio file in js All In One
    HowtogettheexactdurationofanaudiofileinjsAllInOneerrorsaudiodurationtimeprecisebugtime误差bug❌Reducedtimeprecision/时间精度降低Toofferprotectionagainsttimingattacksandfingerprinting,theprecisionofvideo.currentTim......
  • 代码中 isEmpty 和 isBlank 的区别
    也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty/isNoneEmpty/isAnyBlank/isNoneBlank的存在,comeon,让我们一起来探索org.apache.commons.lang3.StringUtils;这个工具类isEmpty系列StringUtils.isEmpty()是否为空.可以看......
  • contemplate、consider、study和weigh的区别
    contemplate、consider、study和weigh都表示经过思考而做出决定的意思。他们的区别在于:contemplate强调思考的过程本身。consider强调思考后做出的决定。study强调决定是通过严谨的研究的。weigh强调决定时在几个选项中进行了权衡。 具体的例子: herefusedeventocon......