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

相关文章

  1. ES6: for-of, 生成器, 迭代器
  2. ES6: 箭头函数和方法定义
原文地址:https://www.cnblogs.com/ziyunfei/p/2855018.html