Generator推导式 - JavaScript 编辑

非标准的。不要使用!
generator推导式是非标准的,而且它不太可能会被添加到ECMAScript。考虑到将来,请使用 generator

 

生成器推导语法是一种JavaScript表达式,它允许您基于现有的可迭代对象快速组合新的生成器函数。

许多编程语言中都存在推导。

看下面,原来Generator推导式语法在SpiderMonkey的不同之处,它是基于对ECMAScript4的提议。

语法

(for (x of iterable) x)
(for (x of iterable) if (condition) x)
(for (x of iterable) for (y of iterable) x + y)

描述

在Generator推导式中,这两种构成方式都是允许的:

for-of迭代器是构成的第一个部分。当由多重部分构成时,后面for-of和if构成方式都是被允许的。

示例

单个构成部分的 generator推导式:

(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"

有if伴随的多重构成的gennerator推导式:

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推导式与Generator函数对比

用一种简单的方式来理解generator推导式的语法并与generator函数来做个比较。

Example 1: 仅是 generator.

var numbers = [ 1, 2, 3 ];

// Generator 函数
(function*() {
  for (let i of numbers) {
    yield i * i;
  }
})()

// Generator 推导式
(for (i of numbers) i*i );

// 结果: 两者都得到 yields [ 1, 4, 9 ]

Example 2: 在 generator 中用if.

var numbers = [ 1, 2, 3 ];

// Generator 函数
(function*() {
  for (let i of numbers) {
    if (i < 3) {
      yield i * 1;
    }
  }
})()

// Generator 推导式
(for (i of numbers) if (i < 3) i);

// 结果: 两者都得到 yields [ 1, 2 ]

规范

Generator推导式是最初在ECMAScript 2015中进行拟稿,但是在14年8月27号修订中被移除了。 请参阅较旧版本的ES2015规范语义.

浏览器兼容性

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support未实现30 (30)未实现未实现未实现
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support未实现未实现30.0 (30)未实现未实现未实现

SpiderMonkey的具体实现笔记

  • let 作为标识符,因为let当前仅可用于JS版本1.7和XUL脚本标记.
  • 目前还不支持解构 (bug 980828).

与旧的JS1.7 / JS1.8理解的区别

  • ES2016 的解析为每个“for”节点创建一个范围,而不是作为一个整体的理解。
    • Old: [...(()=>x for (x of [0, 1, 2]))][1]() // 2
    • New: [...(for (x of [0, 1, 2]) ()=>x)][1]() // 1, 每个迭代都会创建一个新的x的绑定事件。
  •  ES2016的解析以“for”而不是赋值表达式开头。
    • Old: (i * 2 for (i of numbers))
    • New: (for (i of numbers) i * 2)
  • ES2016 解析可以有多个if和for组件。
  • ES2016 解析仅这种方式工作for...of 而不是for...in 的方式迭代。

相关链接

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

词条统计

浏览:132 次

字数:7427

最后编辑:7 年前

编辑次数:0 次

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文