ES6中的Interator

ES6中的Interator

概念 :interator是一种接口机制,为各种不同的数据结构提供统一的访问机制

作用

  1. 为各种数据结构,提供一个统一的简便的访问接口
  2. 使得数据结构的成员按某种次序排列
  3. 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
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值