一、为什么对象不可以被for……of遍历
对象的构造函数的原型中,没有Symbol类型的Symbol.iterator方法
let arr = new Array(10, 20, 30, 40)
console.log(arr)
console.log(arr) //[40,30,20,10]
console.log(arr[Symbol.iterator]())
这里数组可以看到是具有Symbol类型的Symbol.iterator方法的
let obj = {
1: '我是1',
2: '我是2',
3: '我是3',
[Symbol.iterator]() {
let index = 1
return {
next: () => {
var value = this[index]
var done = index > 3
index++
return {
value,
done,
}
},
}
},
}
console.log(obj)
for (value of obj) {
console.log(value) //obj is not iterable
我是1
我是2
我是3
}
二、
二、Iterator迭代器:可遍历对象的构造函数的原型中的Symbol类型的Symbol.iteator方法被实例化对象调用的返回值。返回值是iterator对象
let ite = arr[Symbol.iterator]()
console.log(ite)
console.log(ite.next()) //{value: 40, done: false}
console.log(ite.next()) //{value: 30, done: false}
console.log(ite.next()) //{value: 20, done: false}
console.log(ite.next()) //{value: 10, done: false}
console.log(ite.next()) //{value: undefined, done: true}
三、for……of遍历的底层原理:
可遍历的对象调用构造函数的原型中的Symbol类型的Symbol.iterator方法返回一个iterator迭代器对象
iterator迭代器对象不断的执行next()方法,返回值也是一个对象拥有value和done属性,value的属性值就是