0
点赞
收藏
分享

微信扫一扫

JavaScript迭代器

半秋L 2022-04-13 阅读 23

迭代器的实现

首先定义iterator对象

function createIterator(items) {
    var i = 0;
    return {
        next: function () {
            var done = i >= items.length;
            var value = !done ? items[i++] : undefined;

            return {
                done: done,
                value: value
            }
        }
    }
}

var iterator = createIterator([1, 2, 3]);
//注意  这里的iterator是个对象,里面的next属性对应的是方法。
//下面都是调用的iterator的next方法,并没有重新建立对象。
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
//{ done: false, value: 1 }
//{ done: false, value: 2 }
//{ done: false, value: 3 }
//{ done: true, value: undefined }

直接遍历会报错(iterator is not iterable)

// for (let value of iterator) {
//     console.log(value)
// } //报错  iterator is not iterable

for of 遍历对象需要对象拥有Symbol.iterator的属性

iterator[Symbol.iterator] = function() {
    return createIterator([1, 2, 3])
}
for (let value of iterator) {
    console.log(value)
}//for of 遍历的其实是对象的 Symbol.iterator 属性,数组默认部署了iterator属性

除了数组之外,还有一些数据结构默认部署了 Symbol.iterator 属性。(console.log打印不出来)
所以 for…of 循环可以使用的范围包括:
1.数组
2.Set
3.Map
4.类数组对象,如arguments 对象、DOM NodeList对象
5.Generator 对象
6.字符串

举报

相关推荐

0 条评论