迭代器的实现
首先定义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.字符串