一、为什么对象不可以被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的属性值就是
遍历出的值,done的属性值是布尔类型。直到当done的属性值为true的时候,遍历结束。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。