[译]ES6:数组推导式和生成器推导式
原文:http://www.2ality.com/2013/01/comprehensions.html
ES6中将会有两种推导式:数组推导式(array comprehension)和生成器推导式(generator comprehension),你可以使用它们来快速的组装出一个数组或者一个生成器对象.许多编程语言中都有推导式这一语法,比如:CoffeeScript, Python, Haskell, Clojure.
数组推导式
下面就是一个ES6中的数组推导式的例子:
[for (x of a) for (y of b) if (x > y) [x,y]]
执行该推导式的效果和执行下面这个函数的效果相同(函数中使用了ES6中的for-of循环).
function arrayComprehension() { let result = []; for (x of a) { for (y of b) { if (x > y) { result.push([x,y]); } } } return result; }
数组推导式中可以包含下面两种子式:
- for
- if
数组推导式可以很方便的将一个数组转换成另一个数组:
let numbers = [1,2,3]; let squares = [for (x of numbers) x*x];
不过,配合ES6中的箭头函数(arrow function),使用Array.prototype.map来完成这项任务貌似更方便:
let squares = numbers.map(x => x * x);
生成器推导式
生成器推导式看起来和数组推导式很类似,但它是用小括号括住的,且返回的是一个生成器对象,而不是数组.例如:
(for (x of a) for (y of b) if (x > y) [x,y])
执行该推导式的效果和执行下面这个生成器函数(也是ES6特性)的效果相同
function* generatorComprehension() { for (x of a) { for (y of b) { if (x > y) { yield [x,y]; } } } }
你可以这样遍历生成器对象中的元素:
let compr = ( ... ); for (elem of compr) { console.log(elem); }
Firefox已经实现了这两种推导式?
Firefox虽然早已经实现了这两种推导式,但它实现的语法并不是ES6(而是ES4),如果你愿意,可以简单的了解并尝试一下: