es6——iterator迭代器
iterator的说明
1 es6创建了一种新的迭代器 2 for of 可以遍历使用迭代器 3 Array Arguments Set Map String TypeArray NodeList 都支持 4 iterator是对象的一个symbol类型的属性
1 const arr = ['o', 'r', 'e', 'a']; 2 3 // 不同于for in 的是 for in i 是下标、键 for of 是值 4 for (let i of arr) { 5 console.log(i); // o r e a 6 } 7 8 // 对象的Symbol.iterator属性是一个函数,返回值是一个对象,该对象中有一个next方法 9 // arr也是一个对象 10 let iterator = arr[Symbol.iterator](); 11 console.log(iterator); // Object [Array Iterator] {} 12 // iterator中有一个next方法,每调用一次,next指针的返回值是数据结构的下一位节点对象,第一次调用就是节点对象 13 console.log(iterator.next()); // { value: 'o', done: false } 14 console.log(iterator.next()); // { value: 'r', done: false } 15 console.log(iterator.next()); // { value: 'e', done: false } 16 console.log(iterator.next()); // { value: 'a', done: false }
自定义迭代器iterator
1 let arr = ["zhangsan", "lisi", "wangwu", "zhaoliu"]; 2 arr[Symbol.iterator] = function() { 3 let index = 0; 4 let lock = false; 5 return { 6 next: () => { 7 if (index < this.length && !lock) { 8 index++; 9 return { value: `自定义${this[index-1]}`, done: lock }; 10 } else { 11 lock = true; 12 // done为true时,for of停止遍历 13 return { value: undefined, done: lock }; 14 } 15 }, 16 }; 17 }; 18 for (let i of arr) { 19 console.log(i); // 自定义zhangsan 自定义lisi 自定义wangwu 自定义zhaoliu 20 } 21 22 const iterator = arr[Symbol.iterator](); 23 console.log(iterator.next()); // { value: '自定义zhangsan', done: false } 24 console.log(iterator.next()); // { value: '自定义lisi', done: false } 25 console.log(iterator.next()); // { value: '自定义wangwu', done: false } 26 console.log(iterator.next()); // { value: '自定义zhaoliu', done: false } 27 console.log(iterator.next()); // { value: undefined, done: true } 28 console.log(iterator.next()); // { value: undefined, done: true }