for in 枚举对象属性,包括原型上的, 遍历对象
for of 遍历具有迭代器对象的数据结构,比如 数组,字符串,arguments,map容器,set容器。
迭代器(遍历器对象)底层实现可以用闭包,其实他就是一个遍历数据结构的结构体

function myIterator(arr){
    let index = 0
    return {
        next: function(){
            return index<arr.length? {value:arr[index++],done:false}:{value:undefined, done: true}
        }
    }
}
let targetData = {
    [Symbol.iterator]: function () {
        let index = 0
        return {
            next() {
                return index < this.length? {value: this[index++], done: false}: {value: undefined, done: true}
            }
        }
    }
}

像 for of,解构赋值,三点运算符 默认都是去调iterator接口
用iterator实现多个异步请求
图片说明
图片说明