ES6中的Interator
概念 :interator是一种接口机制,为各种不同的数据结构提供统一的访问机制
作用:
- 为各种数据结构,提供一个统一的简便的访问接口
- 使得数据结构的成员按某种次序排列
- ES6创造了一种新的遍历命令 for…of循环,Interator接口主要供for…of消费
工作原理:
-
创建了某个指针对象,指向当前数据结构的起始位置
-
第一次调用next方法,指针自动指向数据结构的第一个成员
-
接下来不断调用next方法。指针会一直往后移动,直到指向最后一个成员
-
每调用next方法返回的是一个包含value和done的对象,{value:当前成员的值,done:布尔值}
- value:表示当前成员的值,done:对应的布尔值表示当前的数据结构是否遍历结束
- 当遍历结束的时候返回的vaule值时undefined,done值为true
原生具备 Iterator 接口的数据结构:
- Array
- Map
- Set
- String
- TypedArray
- 函数的 arguments 对象
- NodeList 对象
原生具备iterator接口的数据(可用for of遍历)
一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”
//数组
let arr1=[1,2,4,66];
for (let i of arr1) {
console.log(i); //1 2 4 66
}
//字符串
let str="abc";
for (let i of str) {
console.log(i); //a b c
}
//arguments
function fun()
{
for (let i of arguments) {
console.log(i); //5 7 zhangsan
}
}
fun(5,7,"zhangsan");
调用数组中的Symbol.iterator属性,得到遍历器对象
let dataArr=["a","b","c"];
//数组原生就具有遍历器接口,调用数组中的Symbol.iterator属性,得到遍历器对象
let dataIter=dataArr[Symbol.iterator]();
console.log(dataIter); //Array Iterator {} 中包含next方法
//可以调用遍历器中的next方法
console.log(dataIter.next()); // {value: "a", done: false}
console.log(dataIter.next()); // {value: "b", done: false}
console.log(dataIter.next()); // {value: "c", done: false}
//遍历结束
console.log(dataIter.next()); // {value: undefined, done: true}
另外一些数据解构没有部署Iterator接口,比如Object(对象),使用for…of循环,就会报错
//值得注意的是对象(Object)没有部署Iterator
let obj={name:"zhangsan",age:23};
//TypeError: obj is not iterable 报错:obj是不可迭代的
for (let i of obj) {
console.log(i);
}
可以为Object对象部署Iterator接口
自定义一个函数来部署
let iterable = {
a: 'a',
b: 'b',
c: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
console.log(item); // undefined, undefined, undefined
}
Iterator 接口与 Generator 函数
let obj={name:"Lily",age:23};
//obj部署Iterator 迭代器
//function* objGenerator 创建一个迭代器
obj[Symbol.iterator]=function* objGenerator(){
yield this.name;
yield this.age;
}
//obj部署Iterator 迭代器,所以可以使用 for...of
for (let i of obj) {
console.log(i); //Lily 23
}
扩展了解:
三点运算符和解构赋值都是默认的去调用iterator接口
let data1=[1,4];
let data2=[2,3];
//三点运算符
data1=[1,...data2,4];
console.log(data1); //1,2,3,4
//解构赋值
let [a,b]=data1;
console.log(a,b); //1,2