14_Generator

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <!-- 
        for...of 循环
        es6 借鉴 C++、Java、C# 和 Python 语言,引入了 for...of 循环,
        作为遍历所有数据结构的统一的方法。

        一个数据结构只要部署了 Symbol.iterator 属性,就被视为具有 iterator 接口,
        就可以用 for...of 循环遍历他的成员。
        也就是说,for...of 循环内部调用的是数据结构的 Symbol.iterator 方法。

        for...of 循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象
        (比如 arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串
     -->
    <script>

        /*
            数组:
                数组原生具备 iterator 接口(即默认了部署了 Symbol.iterator属性),
                for...of 循环本质上就是调用这个接口产生的遍历器:
        */
        const arr = ['red', 'green', 'blue'];

        for (let v of arr) {
            console.log(v)
        }

        const obj = {};
        obj[Symbol.iterator] = arr[Symbol.iterator].bind(arr);

        for (let c of obj) {
            console.log(c)
        }


        // for...of 循环可以代替数组实例的 forEach 方法:

        const arr1 = ['red', 'green', 'blue'];

        arr1.forEach(function (element, index) {
            console.log(element);
            console.log(index)   // 索引
        })

        // Javascript 原有的 for...in 循环,只能获得对象的键名,不能直接获取键值。es6 提供 for...of 循环,允许遍历获得键值。

        const arr2 = ['a', 'b', 'c', 'd'];

        for (let a in arr2) {
            console.log(a)   // 1 2 3 4  只能获得数组索引
        }

        for (let b of arr2) {
            console.log(b)   // a b c d  可以获得键值,如果要获取数组的索引,可以借助数组实例的 entries 方法和 keys 方法
        }

        // for...of 循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。这一点跟 for...in 循环也不一样。

        let arr3 = [1, 2, 3];
        arr3.foo = 'hello';

        for (let i in arr3) {
            console.log(i)
        }
        for (let j of arr3) {
            console.log(j)    // 不会返回数组的 arr3 的 foo 属性
        }




        /*
            Set 和 Map 结构

            Set 和 Map 结构也原生具有 Itrator 接口,可以直接使用 for...of 循环。
        */


        let engines = new Set(['aaa', 'bbb', 'ccc', 'sss']);
        for (let e of engines) {
            console.log(e)
        }

        let es6 = new Map()
        es6.set('aa', 5);
        es6.set('bb', 'dad');
        es6.set('cc', 'aaaf');
        for (let [name, value] of es6) {
            console.log(name) // 属性名
            console.log(value)// 属性值
        }

        // 注意:首先,遍历的顺序是按照各个成员被添加进数据结构的顺序。
        // 其次:Set 结构遍历时,返回的是一个值,而 Map 结构遍历时,返回的是一个数组,该数组的两个成员分别是当前 Map 成员的键名和键值。

        let map = new Map().set('a', 1).set('b', 2);
        for (let pair of map) {
            console.log(pair)
        }

        for (let [key, value] of map) {
            console.log(key)
            console.log(value)
        }



        /* 
            计算生成的数据结构

            有些数据结构是在现有数据结构基础上,计算生成的。比如:es6的数组、
            Set、Map 部署了以下三个方法,调用后都返回遍历器对象。

                - entries() 返回一个遍历器对象,用来遍历[键名,键值]组成的数组。对于数组,
                键名就是索引值,对于Set ,键名与键值相同。Map 结构的 Iterator 接口,默认
                就是调用 entries() 方法。

                

        */








    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值