首页 > 技术文章 > JS中自定义迭代协议

tengx 2020-04-12 10:13 原文

   /*
            迭代对象
                实现了迭代器的对象
                迭代器:方法 [Symbol.iterator]
        */

        


        var obj = {
            left: 100,
            top: 200
        };

        // 迭代协议
        obj[Symbol.iterator] = function() {
            let keys = Object.keys(obj);    //['left','top']
            let len = keys.length;
            let n = 0;
            

            return {
                next: function() {

                    if (n < len) {
                        return {
                            value: {k: keys[n], v: obj[keys[n++]]},
                            done: false
                        }
                    } else {
                        return {
                            done: true
                        }
                    }
                }
            }
        }
        
        // obj[Symbol.iterator]().next() => {done: true}
        for (var {k, v} of obj) { //of 是一个可迭代的对象
            console.log(k, v);
        }
for of可以迭代实现了迭代协议的对象,每一次循环会执行迭代对象的迭代协议
obj[Symbol.iterator]().next()
应该又是抄的python的迭代器概念。
可以在next函数种定义你想要的迭代方式,返回值done如果是true的时候将停止迭代
value定义每次迭代拿到的内容!

推荐阅读