翻译正在进行中。
The generator comprehensions is non-standard, and it's unlikely to be added to ECMAScript. 考虑到将来,请使用 generator。
The generator comprehension syntax is a JavaScript expression which allows you to quickly assemble a new generator function based on an existing iterable object. Comprehensions exist in many programming languages and the upcoming ECMAScript 7 standard defines array comprehensions for JavaScript.
See below for differences to the old generator expression syntax in SpiderMonkey, based on proposals for ECMAScript 4.
语法
(for (x of iterable) x) (for (x of iterable) if (condition) x) (for (x of iterable) for (y of iterable) x + y)
描述
Inside generator comprehensions, these two kinds of components are allowed:
The for-of
iteration is always the first component. Multiple for-of
iterations or if statements are allowed.
示例
Simple generator comprehensions
(for (i of [ 1, 2, 3 ]) i*i ); // generator function which yields 1, 4, and 9 [...(for (i of [ 1, 2, 3 ]) i*i )]; // [1, 4, 9] var abc = [ "A", "B", "C" ]; (for (letters of abc) letters.toLowerCase()); // generator function which yields "a", "b", and "c"
Generator comprehensions with if statement
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ]; (for (year of years) if (year > 2000) year); // generator function which yields 2006, 2010, and 2014 (for (year of years) if (year > 2000) if(year < 2010) year); // generator function which yields 2006, the same as below: (for (year of years) if (year > 2000 && year < 2010) year); // generator function which yields 2006
Generator comprehensions compared to generator function
An easy way to understand generator comprehension syntax, is to compare it with the generator function.
Example 1: Simple generator.
var numbers = [ 1, 2, 3 ]; // Generator function (function*() { for (let i of numbers) { yield i * i; } })() // Generator comprehension (for (i of numbers) i*i ); // Result: both return a generator which yields [ 1, 4, 9 ]
Example 2: Using if
in generator.
var numbers = [ 1, 2, 3 ]; // Generator function (function*() { for (let i of numbers) { if (i < 3) { yield i * 1; } } })() // Generator comprehension (for (i of numbers) if (i < 3) i); // Result: both return a generator which yields [ 1, 2 ]
规范
Generator comprehensions were initially in the ECMAScript 6 draft, but got removed in revision 27 (August 2014). 请参阅较旧版本的ES6规范语义.
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 未实现 | 30 (30) | 未实现 | 未实现 | 未实现 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 未实现 | 未实现 | 30.0 (30) | 未实现 | 未实现 | 未实现 |
SpiderMonkey-specific implementation notes
let
as an identifier is not supported aslet
is currently only available to JS version 1.7 and XUL scripts tags.- Destructuring in comprehensions is not supported yet (bug 980828).
Differences to the older JS1.7/JS1.8 comprehensions
- ES7 comprehensions create one scope per "for" node instead of the comprehension as a whole.
- Old:
[...(()=>x for (x of [0, 1, 2]))][1]() // 2
- New:
[...(for (x of [0, 1, 2]) ()=>x)][1]() // 1, each iteration creates a fresh binding for x.
- Old:
- ES7 comprehensions start with "for" instead of the assignment expression.
- Old:
(i * 2 for (i of numbers))
- New:
(for (i of numbers)
i * 2
)
- Old:
- ES7 comprehensions can have multiple
if
andfor
components. - ES7 comprehensions only work with
and not withfor...of
iterations.for...in