自定义可迭代对象 (Iterable) --<Javascript 学习笔记 1>

Lemon1x
• 阅读 145

Javascript 学习笔记 1

学过 Python 的同学可能都知道这个玩意,因为这玩意在 Python 还算比较常用,而在 Javascript 中,则不这么知名了,今天就来讲讲。


首先,我想实现一个功能,一个 Object 里,有 fromto 两个 Key,当你用 for .. of .. 去迭代它时,会依次返回 [from, to) 左闭右开的一个数列,那么该咋实现呢。

先把这个 Object 写出来:

/* Iterable */
const obj = {
    from: 0,
    to: 5
};

接下来,我们就要对 obj 进行量身定制,因为目前它还不可迭代,所以要把它变成可迭代对象,这时候就要用到 Symbol 对象中的 iterable 函数:

obj[Symbol.iterator] = function () {
    let current = this.from; // 记录开始值
    const end = this.to; // 记录结束值

    // iterable函数要求返回一个包含next方法的对象
    return {
        next() {
            if (current <= end) {
                return { value: current++, done: false }; // 要求返回一个包含value和done的对象
                // done表示是否结束,false为还没有迭代完毕
            }
            return { value: current, done: true }; // 也可以只返回done而不包含value
        }
    }
}

实际上每次用for .. of .. 去迭代一个对象,只是去调用它的next方法,所以你同样可以这样写:

const obj = {
    from: 0,
    to: 5,

    [Symbol.iterator]() {
        this.current = this.from; // this是obj

        return this;
    },

    next() {
        if (this.current <= this.to) {
            return { value: this.current++, done: false };
        }
        return { value: this.current, done: true };
    }
};

最后,你就得到了一个可迭代对象:

for (let i of obj) {
    console.log(i)
}
// 返回:
/*
0
1
2
3
4
5
*/

第一次写教程向的文章,很生疏,语言可能比较僵硬,以后会改进的,感谢大家的支持。

评论区
推荐文章

暂无数据

Lemon1x
Lemon1x
Lv1
学生
初二的某个班长,目前为JS开发者。 知乎同名,Gitee: Lemonix,Github: Lemonix-xxx
0
文章
0
粉丝
0
获赞
热门文章

暂无数据