• ES6 迭代器


    迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。

    迭代器是用于遍历数据结构元素的指针(如数据库中的游标)

    通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置

    随后通过 next 方法进行向下迭代指向下一个位置, next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性, value 是当前属性的值, done 用于判断是否遍历结束

    当 done 为 true 时则遍历结束

    const items = ["zero", "one", "two"];

    const it = items[Symbol.iterator]();

    it.next();

    >{value: "zero", done: false}

    it.next();

    >{value: "one", done: false}

    it.next();

    >{value: "two", done: false}

    it.next();

    >{value: undefined, done: true}

    上面的例子,首先创建一个数组,然后通过 Symbol.iterator 方法创建一个迭代器,之后不断的调用 next 方法对数组内部项进行访问,当属性 done 为 true 时访问结束。

    迭代器是协议(使用它们的规则)的一部分,用于迭代。该协议的一个关键特性就是它是顺序的:迭代器一次返回一个值。这意味着如果可迭代数据结构是非线性的(例如树),迭代将会使其线性化

    生成器

      生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。星号可以紧挨着function关键字,也可以在中间添加一个空格

       

    // 生成器
    function *createIterator() {
        yield 1;
        yield 2;
        yield 3;
    }
    // 生成器能像正规函数那样被调用,但会返回一个迭代器
    let iterator = createIterator();
    console.log(iterator.next().value); // 1
    console.log(iterator.next().value); // 2
    console.log(iterator.next().value); // 3

    for...of循环

    for...of 是 ES6 新引入的循环,用于替代 for..in 和 forEach() ,并且支持新的迭代协议。它可用于迭代常规的数据类型,如 Array 、 String 、 Map 和 Set 等等。

            在ES6中有3种类型的集合对象:数组、Map集合与Set集合

      为了更好地访问对象中的内容,这3种对象都内建了以下三种迭代器

    entries() 返回一个迭代器,其值为多个键值对
    values() 返回一个迭代器,其值为集合的值
    keys() 返回一个迭代器,其值为集合中的所有键名

    For…of vs For…in

    for...in 循环将遍历对象的所有可枚举属性。

    //for-in-example.js
    Array.prototype.newArr = () => {};
    Array.prototype.anotherNewArr = () => {};
    const array = ['foo', 'bar', 'baz'];
     
    for (const value in array) { 
      console.log(value);
    }
    // Outcome:
    // 0
    // 1
    // 2
    // newArr
    // anotherNewArr

    for...in 不仅枚举上面的数组声明,它还从构造函数的原型中查找继承的非枚举属性,在这个例子中,newArr 和 anotherNewArr 也会打印出来。

    for...of 更多用于特定于集合(如数组和对象),但不包括所有对象。

    注意:任何具有 Symbol.iterator 属性的元素都是可迭代的。

    Array.prototype.newArr = () => {};
    const array = ['foo', 'bar', 'baz'];
     
    for (const value of array) { 
      console.log(value);
    }
    // Outcome:
    // foo
    // bar
    // baz

    for...in 不考虑构造函数原型的不可枚举属性。它只需要查找可枚举属性并将其打印出来。

  • 相关阅读:
    boost::asio::error的用法浅析
    boost::asio::buffer
    sqlserver2008安装图解
    WCF 聊天室程序代码详细讲解教程
    C#中使用Property Grid(属性面板)控件
    TXT>Access 使用DAO数据源!(VB Code)
    读取INI文件 VbCode
    Pet Shop 4
    模式行为型
    C#编程规范
  • 原文地址:https://www.cnblogs.com/yzxyzx/p/12823581.html
Copyright © 2020-2023  润新知