ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用
Posted 水香木鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用相关的知识,希望对你有一定的参考价值。
Iterator 接口与 Generator 函数
Symbol.iterator()方法
的最简单实现
let myIterable =
[Symbol.iterator]: function* ()
yield 1;
yield 2;
yield 3;
;
[...myIterable] // [1, 2, 3]
或者采用下面的简洁写法
let obj =
* [Symbol.iterator]()
yield 'hello';
yield 'world';
;
for (let x of obj)
console.log(x);
// "hello"
// "world"
上面代码中,Symbol.iterator()
方法几乎不用部署任何代码,只要用yield 命令
给出每一步的返回值即可。
遍历器对象的 return(),throw()
遍历器对象除了具有
next()方法
,还可以具有return()
方法和throw()
方法。如果你自己写遍历器对象生成函数,那么next()方法是必须部署的,return()方法和throw()方法是否部署是可选的。
return()方法的使用场合是,如果for...of循环提前退出(通常是因为出错,或者有break语句),就会调用return()方法。
如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return()方法。
function readLinesSync(file)
return
[Symbol.iterator]()
return
next()
return done: false ;
,
return()
file.close();
return done: true ;
;
,
;
上面代码中,函数readLinesSync
接受一个文件对象作为参数,返回一个遍历器对象,其中除了next()方法,还部署了return()方法
。
下面的两种情况,都会触发执行return()方法。
// 情况一
for (let line of readLinesSync(fileName))
console.log(line);
break;
// 情况二
for (let line of readLinesSync(fileName))
console.log(line);
throw new Error();
上面代码中,
-
情况一输出文件的第一行以后,就会执行return()方法,关闭这个文件;
-
情况二会在执行return()方法关闭文件之后,再抛出错误。
注意,
return()方法必须返回一个对象,这是 Generator 语法决定的。
throw()方法主要是配合 Generator 函数
使用,一般的遍历器对象用不到这个方法。
以上是关于ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用的主要内容,如果未能解决你的问题,请参考以下文章