zoukankan      html  css  js  c++  java
  • 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配置使用
    • 提供了遍历所有数据结构的统一操作接口
  • 相关阅读:
    Azure产品目录
    AWS产品目录
    BD
    Cloud Resource
    do-release-upgrade升级笔记
    Gluster vs Ceph:开源存储领域的正面较量
    OpenStack大规模部署详解
    SECURITY ONION:防御领域的kali
    vue非父子组件间传参问题
    vue源码之响应式数据
  • 原文地址:https://www.cnblogs.com/pengsn/p/12892954.html
Copyright © 2011-2022 走看看