目录
一.interator遍历器
1.作用
- 为各种数据结构, 提供一个统一的,便捷的访问接口
- 供for...of消费
2.具备iterator接口的数据结构如下:
- Array/类数组
- String
- Set
- Map
3.iterator遍历器的原理
es6规定,默认的iterator接口部署在数据结构的Symbol.iterator(独一无二的数据类型属性)属性,或者说,一个数据结构只要具有Symbol,iterator属性,就是"可遍历的"
4.Iterator遍历器的执行机制
const arr = [ "虎","虎","生","威" ]
1:得到遍历器对象,本质就是一个指针对象
const iter = arr[Symbol.iterator]()
console,log(iter)
2:调用next方法,指针指向数据结构的第一个成员.后续以此类推
具体来说,就是返回一个包含value和done两个属性的对象.
其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束.
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
5.加强
const str = "2022"
const iter = str[Symbol.iterator]()
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
console.log(iter.next() )
const obj = {
a:1, b:2, c:3 }
obj.[Symbol.iterator]()
对象上面没有部署Symbol.iterator属性
一.for...of 循环
一个数据结构只要内部部署了Symbol.iterator属性,就可以用for..of循环遍历他的成员,也就是说,for..of循环内部调用的是数据结构的Symbol.iterator方法.
for..of循环可以使用的范围包括数组,Set和Map结构.
某些类似数组的对象(如arguments对象,DOM NodeList对象),Genderator对象,以及字符串.
和es5遍历对象的for .. in 类似
const arr = ["虎","虎","生","威"]
for(let item of arr){ console.log(item) }
const str = "2022"
for(let item of str){ console.log(item) }
const obj = { a:1 ,b:2, c:3 }
for(let item of obj){ console.log(item) } 报错 原因:对象不可迭代
for .. of 实现原理
const obj = { a:1 ,b:2, c:3 }
obj[Symbol.iterator] = function(){
let i = 0;
const keys = Object.keys(this)
return {
next:()=>{
return i <= keys.length = 1 ? { value:this[keys[i++]] } : {value:undefined, done:true } } } }
for(let v og obj ){console.log(v)}
const obj = { a:1 ,b:2, c:3 }
obj[Symbol.iterator] = function(){
let i = 0;
const keys = Object.keys(this)
return {
next:()=>{
return i <= keys.length = 1 ? { value:keys[i++] } : {value:undefined, done:true } } } }
for(let v og obj ){console.log(v)}