Iterator

Ecmascript-6
ES6 发布时间2015-6月,又称ECMAScript 2015

http://kangax.github.io/compat-table/es6/

迭代器协议

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols

  • 要成为可迭代对象,一个对象必须实现@@iterator方法,这意味着对象 必须有一个键为@@iterator属性,可通过常量Symbol.iterator访问该属性
  • [Symbol.iterator] - 返回一个符合迭代器协议的对象的无参数函数
  • 只有实现了拥有以下语义的next方法,才能成为一个迭代器
	next() {
		// 返回一个拥有以下两个属性的对象
		{
			done(boolean) // 如果迭代器可以产生序列中的下一个值,则为false; 否则true
			value   //  返回任务的javascript值,done为true是,value=undfiened
		}
	}

Iterator概念

  • 表 集合 概念的数据结构: Array Object Map Set

  • Iterator: 针对不同的表集合的数据结构,统一数据结构的遍历接口

  • 提供统一,简便的访问接口

  • 使得数据结构成员按照某种次序排列

  • ES6新提供的遍历命令 for ... of; 主要供for... of 消费

遍历过程

  • 创建一个指针对象,指向数据结构的起始位置,也就是一个指针对象
  • 第一次调用指针对象的next方法,可以将指针对象指向数据结构的第一个成员
  • 第二次调用指针对象的next方法,可以将指针对象指向数据结构的第二个成员
  • 不断调用next方法,直到它指向数据结构的结束位置
	var arr = [1,2,3,4];
	var it = arr[Symbol.iterator]();
	console.info(it.next()); // {value: 1, done: false}

数据结构的默认Iterator接口

以下类型定义了默认的迭代器。该迭代器可以被 for...of 循环使用

Array.prototype
TypedArray.prototype
String.prototype
Map.prototype
Set.prototype

调用Iterator接口的场景

  • 解构赋值
let set = new Set().add('a').add('b').add('c');

let [x,y] = set; // x='a' y='b'
 
let [first, ...rest] = set; // first = 'a'; rest = ['b','c']

  • 扩展运算符
var str = 'hello';
console.info(...str) ; // ['h','e','l','l','0']

var d = {'a':'123', 'age': '1000'}; 
var b = {'a': '456', ...d}; 
console.info(b); // {a: "123", age: "1000"}
  • yield

后面跟随一个可遍历的结构,它会调用改结构的遍历器接口

let generator = function*(){
	yield 1; 
	yield* [2,3,4];
	yield 5;
}

var it = generator();

for( var item of it) {
	console.info(item); // 1,2,3,4,5
}
  • 其他场合

  • for ... of

  • Array.from()

  • Map(), Set(), WeakMap(), WeakSet()

  • Promise.all()

  • Promise.race()

  • String

遍历

for循环

var arr = [1,3,4], length = arr.length;
for(var i =0 ;i< length; i++) {
	console.info(arr[i]);
}

数组内置的forEach方法

arr.forEach(function(value){
	console.info(value);
});

warn:break命令和return命令都不能奏效

for...in 遍历数组的键名

var aa = [1,2,3];
for( var index in aa) {
	console.info(typeof index) //string
}
  • 数组的键名是数字,而遍历的时候是字符串
  • 不仅变脸数字键名还是遍历手动添加的其他键,甚至包括原型链上的键
  • 某些情况下,for...in循环会以任意顺序遍历键名;
  • 主要是为遍历对象而设计的; 不适用于遍历数组

for ...of

  • 有与for...in一样简洁的语法,但是没有那些缺点
  • 不同用于forEach方法,它可以与break、continue、和return配置使用
  • 提供了遍历所有数据结构的统一操作接口
原文地址:https://www.cnblogs.com/pengsn/p/12892954.html