zoukankan      html  css  js  c++  java
  • Generator的基本用法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Generator基本用法</title>
    </head>
    <body>
    <script type="text/javascript">
        //每个遍历器之间互不干扰,作用域独立
        function* g() {
            var o = 1;
            yield o++;
            yield o++;
            yield o++;
        }
        var gen = g();
        console.log(gen.next().value); // 1
        var xxx = g();
        console.log(gen.next().value); // 2
        console.log(xxx.next().value); // 1
        console.log(gen.next().value); // 3
    
        //next方法参数的作用,是覆盖掉上一个yield语句的值
        function* g2()
        {
            var o = 1;
            var a = yield o++;
            console.log('a = ' + a);
            var b = yield o++;
        }
        var gen = g2();
        console.log(gen.next().value);
        console.log('------');
        console.log(gen.next(11));
    
        //for...of循环可以自动遍历Generator函数时生成的Iterator对象,且此时不再需要调用next方法
        //下面代码使用for...of循环,依次显示5个yield语句的值。这里需要注意,一旦next方法的返回对
        // 象的done属性为true,for...of循环就会中止,且不包含该返回对象,所以上面代码的return语句
        // 返回的6,不包括在for...of循环之中
        function* foo() {
            yield 1;
            yield 2;
            yield 3;
            yield 4;
            yield 5;
            return 6;
        }
    
        let a = foo();
    
        for (let v of a) {
            console.log(v);
        }
        // 1 2 3 4 5
    
        //Generator函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历Generator函数
        //就是说,return的参数值覆盖本次yield语句的返回值,并且提前终结遍历,即使后面还有yield语句也一律无视
        function* gen2() {
            yield 1;
            yield 2;
            yield 3;
        }
        var g = gen2();
        console.log(g.next());          // { value: 1, done: false }
        console.log(g.return('foo'));   // { value: "foo", done: true }
        console.log(g.next());          // {value: undefined, done: true}
    
        //在Generater函数内部,调用另一个Generator函数,用yield*语句
        function* foo2() {
            yield 'a';
            yield 'b';
        }
    
        function* bar() {
            yield 'x';
            yield* foo2();
            yield 'y';
        }
    
        for (let v of bar()){
            console.log(v);
        }
        // "x"
        // "a"
        // "b"
        // "y"
    
    </script>
    </body>
    </html>




  • 相关阅读:
    linux 解压tgz 文件指令
    shell 脚本没有执行权限 报错 bash: ./myshell.sh: Permission denied
    linux 启动solr 报错 Your Max Processes Limit is currently 31202. It should be set to 65000 to avoid operational disruption.
    远程查询批量导入数据
    修改 MZTreeView 赋权节点父节点选中子节点自动选中的问题
    关于乱码的问题解决记录
    我的网站优化之路
    对设计及重构的一点反思
    我的五年岁月
    奔三的路上
  • 原文地址:https://www.cnblogs.com/xutongbao/p/9924963.html
Copyright © 2011-2022 走看看