iterator作用
为所有的数据结构提供统一的访问方式。
接口对象
接口对象一共有3个方法,next()方法、return()方法、throw()方法。
next() 必填
用于for..of迭代。
该方法返回一个对象{value,done}。 value:元素值,done:状态位,用于指定循环是否结束。
return() 可选
用于break语句,或出错结束循环。
throw() 可选
throw方法主要是配合 Generator 函数使用
接口实现
通过内置Symbol.iterator属性来实现接口,该接口主要是返回一个对象指针,然后通过调用接口对象的next方法来实现访问下一个元素值。
具备iterator接口的对象
1:数组
2:字符串
3:函数的 arguments 对象
4: Set/Map 数据结构
5:TypedArray
6:NodeList 对象
接口调用
1:手动调用。
2:for..of语句
3:... (扩展运算符)
特点
for...of循环还有一个特点,就是会正确识别 32 位 UTF-16 字符
实例代码
class Node { constructor(value) { this.value = value; this.next = null; } } class Link { /** * 构造函数 */ constructor(value) { this.head = new Node(value); } /** * 插入 * @param {any} value * @param {any} item */ insert(value, item) { let node = new Node(value); let current = this.find(item); node.next = current.next; current.next = node; } /** * 查询节点 * @param {any} item * @returns {Node} */ find(item) { let current = this.head; while (current && current.value != item) { current = current.next; } return current; } /** * iterator接口实现 */ [Symbol.iterator]() { let current = null, target = this; return { next() { current = current != null ? current.next : target.head; if (current != null) { return { value: current.value, done: false }; } return { value: undefined, done: true }; }, return() { return { done: true } } } } }
let l = new Link(0); l.insert(2, 0); l.insert(5, 2); l.insert(3, 2); // 到2的后面插入一个3 // for..of 方式调用接口 for (let o of l) { console.log(o); } // 扩展运算符调用接口 console.log(...l); // 手动调用。 // 获取接口对象 let iter = l[Symbol.iterator](); // 调用next 方法 console.log(iter.next()); console.log(iter.next()); console.log(iter.next());
源码下载:https://pan.baidu.com/s/1sASqhXzIC94ae-SYYv0CAg
我的百度经验:https://jingyan.baidu.com/article/b7001fe1c5a1240e7282dd8b.html
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!