在 JavaScript 中,for...of 循环用于遍历可迭代对象,例如数组、字符串、Map、Set 等。然而,普通对象(Object)并不是默认的可迭代对象,因此无法直接使用 for...of 循环进行遍历。
var obj = {'a': 1, 'b': 2}
for(let item of obj) {
console.log(item)
}
// Error: Uncaught TypeError: obj is not iterable
上述代码会直接报错 Uncaught TypeError: obj is not iterable
实例
面试过程中经常会碰到手撕代码环节,假设你是参加面试的应聘者,要你实现如下功能:
// 定义一个 Person 对象
const Person = {
name: 'John',
age: 30,
city: 'New York'
};
// 处理,对Person进行改写
// doSomething……
// 使用 for...of 循环遍历 Person 对象
for (const [key, value] of Person) {
console.log(`${key}: ${value}`);
}
// 输出
// name: John
// age: 30
// city: New York
分析
核心原理:对象{}默认不支持for of遍历,要实现for of遍历关键在于Symbol.iterator。因此要实现上述遍历功能,需要增加一个key属性实现迭代器功能,实现代码如下
// 定义一个 Person 对象
const Person = {
name: 'John',
age: 30,
city: 'New York'
};
// 为 Person 对象添加 Symbol.iterator 方法
Person[Symbol.iterator] = function() {
const keys = Object.keys(this);
let index = 0;
return {
next: () => {
if (index < keys.length) {
const key = keys[index++];
return { value: [key, this[key]], done: false };
} else {
return { done: true };
}
}
};
};
// 使用 for...of 循环遍历 Person 对象
for (const [key, value] of Person) {
console.log(`${key}: ${value}`);
}
// 输出
// name: John
// age: 30
// city: New York
解释
Symbol.iterator方法为Person对象添加了迭代功能。它返回了一个包含next方法的迭代器对象。next方法返回当前属性名及其对应的值,并将done设置为false,直到迭代结束时,done被设置为true。for...of循环遍历每一个键值对,并打印出来。
通过这种方式,你可以成功遍历对象的属性和值,同时利用 for...of 循环。