【面试题】for...in 和 for...of 的区别

简介: 【面试题】for...in 和 for...of 的区别

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

JavaScript 是一门强大而灵活的编程语言,提供了多种迭代对象的方式。两个常见的迭代方式是 for...infor...of 循环。这两种循环用于遍历对象和数组中的元素,但它们有许多重要的区别和适用场景。在本文中,我们将深入探讨 for...infor...of 循环的区别,以及何时使用它们。

1. for...in 循环

for...in 循环是一种用于遍历对象的属性的迭代方式。它的语法结构如下:

for (const key in object) {
  // 执行代码
}

1.1 遍历对象属性

for...in 循环主要用于遍历对象的属性,它会将对象的每个可枚举属性作为迭代变量 key 的值。

const person = {
  name: 'John',
  age: 30,
  city: 'New York'
};
for (const key in person) {
  console.log(key, person[key]);
}

在上面的示例中,for...in 循环遍历了 person 对象的属性,并打印了每个属性的名称和值。

1.2 遍历原型链属性

for...in 循环不仅会遍历对象自身的属性,还会遍历其原型链上的属性。这可能会导致意外的结果,因为你可能会获取到不是你期望的属性。

function Person(name) {
  this.name = name;
}
Person.prototype.age = 30;
const john = new Person('John');
for (const key in john) {
  console.log(key, john[key]);
}

在上面的示例中,for...in 循环不仅遍历了 john 对象自身的属性(name),还遍历了其原型链上的属性(age)。

1.3 按照随机顺序

for...in 循环不保证按照属性的顺序进行迭代。属性的顺序可能是随机的,这取决于 JavaScript 引擎的实现。

const person = {
  name: 'John',
  age: 30,
};
for (const key in person) {
  const value = person[key];
  console.log(key, value);
}

在上面的示例中,属性的遍历顺序可能是 bac 或其他随机顺序。

1.4 不能直接访问属性值

for...in 循环中,你需要通过属性的名称来访问属性的值,这可能会使代码看起来更加冗长。

const person = {
  name: 'John',
  age: 30,
};
for (const key in person) {
  const value = person[key];
  console.log(key, value);
}

在上面的示例中,我们需要使用 person[key] 来访问属性值,而不能直接访问。

2. for...of 循环

for...of 循环是一种用于遍历可迭代对象(如数组、字符串、Map、Set 等)的迭代方式。它的语法结构如下:

for (const element of iterable) {
  // 执行代码
}

2.1 遍历数组元素

for...of 循环非常适合遍历数组中的元素,它会将数组的每个元素作为迭代变量 element 的值。

const numbers = [1, 2, 3, 4, 5];
for (const num of numbers) {
  console.log(num);
}

在上面的示例中,for...of 循环遍历了 numbers 数组的元素,并打印了每个元素的值。

2.2 不遍历对象属性

for...in 循环不同,for...of 循环不会遍历对象的属性,它专门用于遍历可迭代对象。如果你尝试将对象用于 for...of 循环,将会得到错误。

const person = {
  name: 'John',
  age: 30,
};
for (const value of person) {
  console.log(value);
}
// TypeError: person is not iterable

在上面的示例中,尝试遍历 person 对象会导致类型错误,因为对象不是可迭代的。

2.3 按照顺序迭代

for...of 循环保证按照对象中元素的顺序进行迭代。这意味着遍历数组时会按照数组的顺序进行,不会出现随机顺序的情况。

const colors = ['red', 'green', 'blue'];
for (const color of colors) {
  console.log(color);
}

在上面的示例中,属性的遍历顺序是 redgreenblue

2.4 直接访问元素值

for...of 循环中,你可以直接访问可迭代对象的元素值,而不需要使用索引或属性名称。

const numbers = [1, 2, 3, 4, 5];
for (const num of numbers) {
  console.log(num);
}

在上面的示例中,我们可以直接访问 num 变量来获取数组元素的值,而不需要使用 numbers[num]

4. 总结

for...infor...of 循环都是 JavaScript 中用于迭代的有用工具,但它们有不同的用途和适用场景。了解它们的区别可以帮助你更好地选择合适的迭代方式。

  • 使用 for...in 循环遍历对象的属性,但要注意遍历原型链上的属性。
  • 使用 for...of 循环遍历可迭代对象的元素,例如数组、字符串、Map、Set 等,它更直观且不会遍历原型链属性。

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:web前端面试题库

相关文章
|
4月前
|
Java
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
HashSet基于哈希表实现,无序且可以有一个null元素;TreeSet基于红黑树实现,支持排序,不允许null元素。
|
4月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
4月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
19天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
51 14
|
3月前
|
Android开发 Kotlin
Android经典面试题之Kotlin的==和===有什么区别?
本文介绍了 Kotlin 中 `==` 和 `===` 操作符的区别:`==` 用于比较值是否相等,而 `===` 用于检查对象身份。对于基本类型,两者行为相似;对于对象引用,`==` 比较值相等性,`===` 检查引用是否指向同一实例。此外,还列举了其他常用比较操作符及其应用场景。
194 93
|
18天前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
编译器
经典面试题:变量的声明和定义有什么区别
在编程领域,变量的“声明”与“定义”是经典面试题之一。声明告诉编译器一个变量的存在,但不分配内存,通常包含变量类型和名称;而定义则为变量分配内存空间,一个变量必须至少被定义一次。简而言之,声明是告知变量形式,定义则是实际创建变量并准备使用。
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
173 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
前端开发 小程序 JavaScript
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
58 0