Page 155 - 你不知道的JavaScript(下卷)
P. 155
ES6 中还包括几个新的称为集合(参见第 5 章)的数据结构。这些集合不仅本身是
iterable,还提供了 API 方法来产生迭代器,比如:
var m = new Map();
m.set( "foo", 42 );
m.set( { cool: true }, "hello world" );
var it1 = m[Symbol.iterator]();
var it2 = m.entries();
it1.next(); // { value: [ "foo", 42 ], done: false }
it2.next(); // { value: [ "foo", 42 ], done: false }
..
迭代器的 next(..) 方法可以接受一个或多个可选参数。绝大多数内置迭代器没有利用这个
功能,尽管生成器的迭代器肯定有(参见 3.2 节)。
通用的惯例是,包括所有内置迭代器,在已经消耗完毕的迭代器上调用 next(..) 不会出
错,而只是简单地继续返回结果 { value: undefined, done: true }。
3.1.3 可选的 return(..) 和 throw(..)
多数内置迭代器都没有实现可选的迭代器接口——return(..) 和 throw(..)。然而,在生
成器的上下文中它们肯定是有意义的,参见 3.2 节获取更多信息。
return(..) 被定义为向迭代器发送一个信号,表明消费者代码已经完毕,不会再从其中提
取任何值。这个信号可以用于通知生产者(响应 next(..) 调用的迭代器)执行可能需要的
清理工作,比如释放 / 关闭网络、数据库或者文件句柄资源。
如果迭代器存在 return(..),并且出现了任何可以自动被解释为异常或者对迭代器消耗的
提前终止的条件,就会自动调用 return(..)。你也可以手动调用 return(..)。
return(..) 就像 next(..) 一样会返回一个 IteratorResult 对象。一般来说,发送给
return(..) 的可选值将会在这个 IteratorResult 中作为 value 返回,但在一些微妙的情况
下并非如此。
throw(..) 用于向迭代器报告一个异常 / 错误,迭代器针对这个信号的反应可能不同于针对
return(..) 意味着的完成信号。和对于 return(..) 的反应不一样,它并不一定意味着迭代
器的完全停止。
例如,通过生成器迭代器,throw(..) 实际上向生成器的停滞执行上下文中插入了一个抛
出的异常,这个异常可以用 try..catch 捕获。未捕获的 throw(..) 异常最终会异常终止生
成器迭代器。
132 | 第 3 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权