// Iterator 不支持遍历的数据进行遍历
// function makeIterator(arr) { //创建一个指针,实际就是一个指针对象下标为0
// let nextIndex = 0
// return {
// next() {
// return nextIndex< arr.length? {
// value: arr[nextIndex++],
// done: false
// }:{
// value: undefined,
// done: true
// }
// }
// }
// }
// let it = makeIterator(['a','b', 'c'])
// console.log(it.next()) //{value: "a", done: false}
// console.log(it.next()) //{value: "b", done: false}
let arr = ['a','b', 'c']
let it1 = arr[Symbol.iterator]()
console.log(it1.next())
//具有原生Iterator接口的数据结构 Array Map Set Map String TypeArray 函数的arguments对象 NodeList对象
// 可迭代协议:Symbol.iterator
// 迭代器协议: return { next() { return {value, done}}
let courses = {
allCourse: {
frontend: ['ES', '小程序', 'Vue', 'React'],
backend: ['Java', 'Python', 'SpringBoot'],
webapp: ['Android', 'IOS']
}
}
// courses[Symbol.iterator] = function (){
// let allCourse = this.allCourse
// let keys = Reflect.ownKeys(allCourse)
// let values = []
// return {
// next() {
// if(!values.length) {
// if (keys.length) {
// values = allCourse[keys[0]]
// keys.shift()
// }
// }
// return {
// done: !values.length,
// value: values.shift()
// }
// }
// }
// }
//Generator
courses[Symbol.iterator] = function* (){
let allCourse = this.allCourse
let keys = Reflect.ownKeys(allCourse)
let values = []
while (1){
if(!values.length) {
if (keys.length) {
values = allCourse[keys[0]]
keys.shift()
yield values.shift()
} else{
return false
}
}else{
yield values.shift()
}
}
}
for (let c of courses) {
console.log(c)
}
一起设计吧