[译]ES6:数组推导式和生成器推导式

2013-01-11 00:43

[译]ES6:数组推导式和生成器推导式

by 紫云飞

at 2013-01-10 16:43:00

original http://www.cnblogs.com/ziyunfei/archive/2013/01/10/2855018.html

原文: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) xx];


不过,配合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),如果你愿意,可以简单的了解并尝试一下:



相关文章



  1. ES6: for-of, 生成器, 迭代器

  2. ES6: 箭头函数和方法定义

本文链接