给object增加forof功能

167 阅读1分钟

刚刚看红宝书到迭代器相关内容,忍不住想试试自己实现一下迭代器

let obj = {
	name: 'name',
	age: 18,
};
obj[Symbol.iterator] = () => {
	let keys = Object.keys(obj);
	let tol = 0;
	return {
		next() {
			if (tol === keys.length) {
				return { done: true, value: undefined };
			} else {
				return { done: false, value: obj[keys[tol++]] };
			}
		},
	};
};
for (let i of obj) {
	console.log(i);
}
//name
//18

后面再看到生成器的时候,get到另一个更简单的写法

let obj = {
	name: 'name',
	age: 18,
};
obj[Symbol.iterator] = function* () {
	for (let i in this) {
		yield obj[i];
	}
};
for (let i of obj) {
	console.log(i);
}
//name
//18

这两种写法看起来有点脱裤子放屁的嫌疑,直接用forin不就可以了吗。但在创建集合,映射,promise.all等场景下是很有实用意义的。比如说如果某个页面需要请求多个字典数据,字典接口之前放在了object里方便处理逻辑,这时候就可以写个迭代器直接放到promise.all里。当然这个场景也是可以用其他方法处理,具体情况具体考虑吧。