-
一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循环遍历它的成员(map、set、数组、类数组、Generator、字符串)
-
模拟iterator
function iterator(data) { let i = 0 return { next: function () { return { done: data.length <= i, value: data.length > i ? data[i++] : undefined } } } } var arr = iterator([1, 2, 3])传入的数据编译到scope中,通过调用对象中的next方法有序遍历数据。
-
模拟for of
function forOf(obj, cb) { // 生成迭代器对象 let iterator = obj[Symbol.iterator]() let res = iterator.next() while (!res.done) { cb(res.value) res = iterator.next() } } forOf([5, 6, 7], function (data) { console.log(data); })
-
数组、Set、Map 部署了entires()、 keys()、 values()三个方法,分别遍历[键名, 键值]组成的数组、键名、键值
let arr = ['a', 'b', 'c']; for (let pair of arr.entries()) { console.log(pair); }