day4(2019-2-22 周日) JavaScript中的Generator函数 和 iterator函数

5 篇文章 0 订阅

打算分为:简介和高阶用法

/* auth: Allan_Liu
   date: 2019-2-24
    mail: allan_liu986@163.com
    info:
      Generator函数的简介:
        1. *代表是生成器函数(Generator)
        2. yield关键字是ES6的新特性,通过它来指定调用next()方法时的 返回值 及 返回顺序(比如Example1)
        3. yield可以返回任何值或者表达式。(比如可以在循环中使用yield, 比如Example2)
        4. 特性:每当执行完一条yield语句时,会自动停止执行。示例中直到遇到下次调用next()方法。
        5. 可以通过函数表达式创建生成器,只需要在function和小括号中间添加 *(比如:let a = function *(){...} )
        6. 也可以用ES6函数的简写方式来创建生成器函数, *createrGenerator() {...} ,功能上并无差别。
    waring:
        1. yeild不可在生成器的嵌套函数中使用,与return一样不能穿越function的边界(比如Example3)
        2. 不能用箭头函数来创建生成器
  */
    
//Example1
      var color = 'green'
      function *createrGenerator() {
        yield 1.1;
        yield 'abc';
        yield color;
      }
      let generator = createrGenerator();
      console.log(generator.next().value)  //1.1
      console.log(generator.next().value)  //'abc'
      console.log(generator.next().value)  //'green'
//Example2
      function *generatorFunc(values) {
        for(let items of values) {
          yield items +1; //yield可以进行加减操作
        }
      }
      
      let generatorFunc1 = generatorFunc([1,2,3])
      console.log(generatorFunc1.next().value);//2
      console.log(generatorFunc1.next().value);//3
      console.log(generatorFunc1.next().value);//4
//Example3
      function *generator(items) {
        items.forEach(function(item){
          yield item + 1; //Uncaught SyntaxError: Unexpected identifier
        });
      }
      let generator1= generator([1,2,3])
      console.log(generator1.next())

2.forEarch 和 for…in 和 for…of 的区别?

/*
  auth: Allan_Liu
  date: 2019-2-25
  mail: allan_liu986@163.com
  question:forEarch 和 for..in 和 for..of  的区别?
  answer:
      1. for..in是ES5提出,遍历数组中的索引(一般用来遍历对象)。
        还会遍历自定义添加的属性(如Example1中还可以遍历obj1原型上的对象)
        可用break和return语句
      2. for..of是ES6提出,遍历数组中的元素(区别于以前的for循环以遍历索引为主)。原理是通过ES6的iterator(迭代器)实现的。
         可用break和return语句
      3. forEarch不能使用break跳出循环,或者return从函数题返回(如Example2)。

*/

//Example1
var object = {a: 1, b: 2};
function createrFunc1() {
  this.color = 3;
  this.color1 = 'red';
}
createrFunc1.prototype = object;
var obj1 = new createrFunc1()
for(var i in obj1) {
  console.log(`obj1.${i} = ${obj1[i]}`); //
}

//Example2
var arr = [1,2,3]
for(let i of arr) {
  if(i > 2) { //i为每一个元素
    break;
  }
  console.log(i, '--for--of--')// 1 和 2
}
arr.forEach(item => {
  if(item > 2) { 
    break;  //Uncaught SyntaxError: Illegal break statement  (非法的break语句)
  }
})

for(let i in arr) {
  if(i > 1) { //i为索引
    break;
  }
  console.log(i, '--in--')
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值