迭代器(Iterator)
- Iterator 接口就是对象里面的一个属性
Symbol.iterator - 工作原理
// 声明一个数组 const xiyou = ['唐僧','孙悟空','猪八戒','沙僧'] // 使用 for...of 遍历数组 // for --> in 的话是保存键名 of 保存键值 // for(let v of xiyou) { // console.log(v) // } console.log(xiyou) // 获取这个 iterator 这个对象 通过 Symbol(Symbol.iterator): ƒ values() let iterator = xiyou[Symbol.iterator]() console.log(iterator, typeof iterator)// Array Iterator {} "object" // 调用对象的 next 方法 console.log(iterator.next()) // {value: "唐僧", done: false} console.log(iterator.next()) // {value: "孙悟空", done: false} console.log(iterator.next()) // {value: "猪八戒", done: false} console.log(iterator.next()) // {value: "沙僧", done: false} console.log(iterator.next()) // {value: undefined, done: true}
迭代器自定义遍历对象
// 声明一个对象 const banji = { name: '终极一班', stus: [ 'xiaoming', 'xiaoning', 'xiaotian', 'knight' ], [Symbol.iterator]() { // 索引变量 let index = 0; console.log('原先的this指向:',this) // {name: "终极一班", stus: Array(4), Symbol(Symbol.iterator): ƒ} let _this = this return { next: function() { if(index < _this.stus.length){ console.log('之后的this指向:',this) // {next: ƒ} const result = {value: _this.stus[index],done: false} // 下标自增 index ++ // 返回结果 return result }else { return {value: undefined,done: true} } } } } } // 遍历这个对象 for(let v of banji) { console.log(v) }