生成器,迭代器
生成器函数生成一个迭代器,迭代器中有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()