迭代器
遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问 机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成 员)
作用:
- 一是为各种数据结构,提供一个统一的、简便的访问接口
- 二是使得数 据结构的成员能够按某种次序排列
- 三是ES6创造了一种新的遍历命令
for...of
循环,Iterator接口主要 供for...of
消费
迭代器的迭代过程
- 通过
Symbol.iterator
创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象 - 第一次调用指针对象的
next()
方法,可以将指针指向数据结构的第一个成员 - 随后通过
next()
方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了value
和done
两个属性, value 是当前属性的值, done 用于判断是否遍历结束 - 不断调用指针对象的next方法,直到它指向数据结构的结束位置,即当
done
为 true 时则遍历结束
const items = ["1", "2", "3"];
const it = items[Symbol.iterator]();
console.log( it.next()) //{ value: '1', done: false }
console.log( it.next()) //{ value: '2', done: false }
console.log( it.next()) //{ value: '3', done: false }
//这里已经迭代完成,如果再调用next()方法,那么得到的就是{ value: undefined, done: true }
console.log( it.next())
//在进行遍历操作依旧是{ value: undefined, done: true },因为迭代在上述的三个打印语句中已经完成
for(let i =0;i<items.length;i++){
console.log( it.next())
}
可迭代的数据结构
- Array
- String
- Map
- Set
- arguments
- TypedArray
- NodeList
for...of
可遍历的数据格式
Array
数组 ( Array ) 和类型数组 ( TypedArray ) 他们是可迭代的。
arr=[1,2,3]
for (const iterator of arr) {
console.log(iterator)
} //1 2 3
String
字符串是可迭代的,单他们遍历的是 Unicode 码,每个码可能包含一个到两个的 Javascript 字符。
Map
Map 主要是迭代它们的 entries ,每个 entry 都会被编码为 [key, value] 的项, entries 是以确定的形式进行迭代,其顺序是与添加的顺序相同。
const map = new Map();
map.set(0, "zero");
map.set(1, "one");
for (let item of map) {
console.log(item);
} // [ 0, 'zero' ] [ 1, 'one' ]
Set
Set 是对其元素进行迭代,迭代的顺序与其添加的顺序相同
const set = new Set();
set.add("zero");
set.add("one");
for (let item of set) {
console.log(item); //zero one
}
argument
function args() {
for (let item of arguments) {
console.log(item); //zero one
}
}
args("zero", "one");
注意点:普通对象不可迭代
//普通对象不可迭代
let obj={
name:'zhangsan',
age:15
}
for (const iterator of obj) {
console.log(iterator) //报错 obj is not iterable
}
版权声明:本文为qq_40708840原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。