● for of 可以遍历拥有迭代接口的数据,如数组,Set,Map等,但是却不能操作普通对象
● 因为普通对象里面没有迭代器接口
○ 可以看到这些可遍历的数据类型的原型上,都有一个Symbol.iterator函数
let a = [1,2,3]
let set = new Set([1,2,3])
console.log(a[Symbol.iterator]())
○ 返回一个带有next方法的对象
■ 调用这个方法,返回来数组的第一个值,可以看到,for of实际是调用了这个数据上的[Symbol.iterator]方法,实现了数据的遍历,普通对象上虽然没有这个方法,但是可以自己实现
let a = [1,2,3]
let set = new Set([1,2,3])
console.log(a[Symbol.iterator]().next()) // { value:1,done:false}
let obj = {
store:[1,2,3,4],
[Symbol.iterator]:function(){
let index = 0;
let self = this
return {
next:function(){
return {
value:self.store[index],
done:index++ >= self.store.length
}
}
}
}
}
for(const item of obj){
console.log(item) //1 2 3 4
}