简述ES6规定for…in 和for…of有什么区别?
ES6中的for...in
循环和for...of
循环都用于遍历集合,但它们之间存在几个关键的区别,主要反映在遍历的对象和遍历方式上:
for…in循环
- 遍历对象的属性:
for...in
循环用于遍历一个对象的所有可枚举属性,包括继承的可枚举属性。 - 键的遍历: 在循环中,每次迭代提供的是对象属性的键(即属性名)。
- 主要用途: 适用于遍历对象属性,但也可以用于遍历数组(尽管不推荐,因为它会返回数组索引,且可能包括原型链上的属性)。
示例:
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
console.log(key); // 输出: a, b, c
}
for…of循环
- 遍历可迭代对象的值:
for...of
循环用于遍历任何可迭代对象的元素,包括Array、Map、Set、String、TypedArray、arguments对象等,以及任何定义了迭代器行为的对象。 - 值的遍历: 在循环中,每次迭代提供的是集合元素的值。
- 主要用途: 适用于遍历具有迭代器接口的数据结构的值,提供了一种简洁、直观的遍历方式。
示例:
const arr = [1, 2, 3];
for (const value of arr) {
console.log(value); // 输出: 1, 2, 3
}
区别总结
- 遍历内容不同:
for...in
遍历对象的键,而for...of
遍历可迭代对象的值。 - 应用场景不同:
for...in
主要用于遍历对象属性,for...of
主要用于遍历具有迭代器接口的集合的元素。 - 性能考虑: 对于数组和其他可迭代集合,
for...of
通常是更好的选择,因为它直接遍历值且避免了for...in
可能会遍历到原型链属性的问题。
因此,在实际开发中,选择for...in
还是for...of
应根据你的具体需求和遍历的数据类型来决定。