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 数据结构

5TypedArray

6NodeList 对象

 

接口调用

1:手动调用。

2for..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

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!