迭代器(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)
}