简单的总结一下es6的生成器函数

生成器,迭代器

生成器函数生成一个迭代器,迭代器中有next方法,并且返回一个对象,里面包含value,done这两个属性的一个对象

var iterable={
  next:function(不接受参数){
    表达式//不建议用这个
   return{
      value:,
      next:
    }
  }
}
var generated=iterable.next()
while(!generated.done){
  console.log(generated.value)
  generated=iterable.next()
}
for (var val of iterable){
  console.log(val)
}//自动处理这个问题


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

yield*这种语句让我们可以在Generator函数里面再套一个Generator, 当然你要在一个Generator里面调用另外的Generator需要使用: yield* 函数() 这种语法

function *g(a,b,c){//没有*不能写yield
  表达式
  yield 
}
var iter=g()
for (var xxx of iter ){//逐次将yield中的数字表现出来
  console.log(xxx)
}
以f.next()调用
以for of 调用
[...]也可以调用
eg:一个自然数的函数
function *range(start,end,step){
  for(i=start;i<end;i+=step){
    yield i //抛出这个值
  }
}
var a = range()
a.next()
for (n of range(xxx))
将range中的所有yield抛出来
当使用的if语句时,这个for of停止之后,函数也将会停止运行

next()的参数会穿给上一个 yield 成为上一个的值(返回结果)
如果给了 \throw() 这个函数会立即报错 以try catch 接住错误会继续运行(给的也是上一个yield的返回值)
需要用 try catch 接住这个错误
return 直接结束函数 返回这个值 其他的值有没有都没有关系
在 for of 中可以用break跳出去
for (x of ary){
  xxxxxxx
  if(xxxx){
    break
  }
} 

forof 类 实现

生成器的实例----迭代器
Generator:生成器
iterable (迭代对象)
function forof(iterable,body){
  if(iterable.toString()!=='[object Generator]'){//判断这个函数是不是生成器类型 是的话就什么都不做
    iterable=iterable[Symbol.iterator]()//不是的话调用他的迭代器特性 一定要调用
    if(!/Generator|Iterator/.test(iterable.toString())){//判断迭代器是否存在
      throw new TypeError(iterable + 'is not iterable')
    }//不存在 报错 不可迭代
  }//可以停止迭代`7
  var cur =iterable.next()//说明可迭代
  while(!cur.done){//存在则遍历
    if(body(cur.value)===false){//当给next()传参停止这个迭代器
      iterable.return()//迭代函数停止
      break//跳出循环
    }
    cur=iterable.next()//如果这个函数没有停止,继续下一项
  }
}
[Symbol.iterator] 一个新方法.返回一个迭 代器

给没有[Symbol.iterator]的对象添加这个属性
Object.prototype[Symbol.iterator]=function*(){
  for(key in this ){
    yield this[key]
  }
} 



对象中可以添加 Symbol()属性//原始类型 (数字 字符串 symbol undefind)
eg:var a =Symbol()
var obj={}
obj[a]=1
obj{
  Symbol():1
}
a=null //不可读也不可写
obj[a]==undfind(true)
//var b =a
a=null
obj[b]===1 (true)

通过for 创建出来的Symbol是可以再次创建的
var a =Symbol.for('123')
var b =Symbol.for('123')
a===b
true
matches
ie不支持的情况下用msMatchesSelector()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值