JavaScript给对象部署Iterator接口实现for-of

for...of... 底层是 Symbol.iterator接口
自己获取Symbol.iterator接口的遍历器 对象, 自己来实现遍历的过程
此对象拥有Symbol.iterator, 就能用for...of遍历

let arr = [5, 9, 20, "我的"];
1. 获取遍历器对象(遍历用的指针)
let iter = arr[Symbol.iterator]();
console.log(iter)
2. 调用next() 会往下移动一个位置, 返回当前位置的元素
// 遍历器会对5这个元素, 包装成一个对象来返回
console.log(iter.next()); // {value: 5, done: false} // done是否结束
console.log(iter.next()); // {value: 9, done: false}
console.log(iter.next()); // {value: 20, done: false}
console.log(iter.next()); // {value: "我的", done: false}
console.log(iter.next()); // {value: undefined, done: true} // 遍历结束的标志

尝试给对象部署Iterator接口

let obj = {d: 'dd',b: 'dee',k: 22};
// console.log(Object.keys(obj)); // Object.keys()是专门用于提取对象所有的key, 把所有的key放在一个数组中返回

// 封装的话 把obj换成Object.prototype
obj[Symbol.iterator] = function() {// 1. 因为对象没有此属性, 所以添加一个
	let keys = Object.keys(this);//2. 提取所有的key, 为了下面进行遍历, Symbol.iterator不会被获取
	let index = 0;//数组的下标, 为了每次取出一个key
	return {//返回一个迭代器对象
		next: () => {
			if (index < keys.length) {//>= keys数组长度, 遍历结束, 返回如下对象(为了告诉for...of遍历结束)
				let key = keys[index];
				index++;
				return {
					value: {[key]: this[key]},
					done: false
				};
			} else {
				return {
					value: undefined,
					done: true
				}
			}
		}
	}
}

console.log(obj);

可以调用for of

for (let key of obj) {
    console.log(key);
}

//打印

{d: "dd", b: "dee", k: 22, Symbol(Symbol.iterator): ƒ}
dyh-02-给对象部署iterator接口.html:40 {d: "dd"}d: "dd"__proto__: Object
dyh-02-给对象部署iterator接口.html:40 {b: "dee"}
dyh-02-给对象部署iterator接口.html:40 {k: 22}

posted @   JackieDYH  阅读(3)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示