前言

原书 《Understanding ECMAScript 6》,作者 Nicholas C. Zakas , 在线阅读地址。此外作者本人为此书也在 github 上设置了 专区,发现问题可以到那里去提交 issue 。

JavaScript 核心语言功能在名为 ECMA-262 的标准中定义。该标准中定义的语言称为 ECMAScript。您所知道的浏览器和 Node.js 中的 JavaScript 实际上是 ECMAScript 的超集。浏览器和 Node.js 通过额外的对象和方法添加更多功能,但该语言的核心仍然是 ECMAScript 中定义的。 ECMA-262 的持续开发对于整个 JavaScript 的成功至关重要,本书涵盖了该语言的最新重大更新:ECMAScript 6 所带来的变化。

在 ECMAScript6 标准定稿之前,已经开始出现了一些实验性的转译器(Transpiler),例如谷歌的 Traceur,可以将代码从 ECMAScript6 转换成 ECMAScript5。但它们大多功能非常有限,或难以插入现有的 JavaScript 构建管道。

但是,随后出现了新型转译器 6to5 改变了这一切。它易于安装,可以很好的集成现有的工具中,生成的代码可读,于是就像野火一样逐步蔓延开来,6to5 也就是现在鼎鼎大名的 Babel。

ECMAScript6的演变之路

JavaScript 核心的语言特性是在标准 ECMA-262 中被定义,该标准中定义的语言被称作 ECMAScript,它是 JavaScript 的子集。

  • 停滞不前:逐渐兴起的 Ajax 开创了动态 Web 应用的新时代,而自 1999 年第三版 ECMA-262 发布以来,JavaScript 却没有丝毫的改变。

  • 转折点:2007 年,TC-39 委员会将大量规范草案整合在了 ECMAScript4 中,其中新增的语言特性涉足甚广,包括:模块、类、类继承、私有对象成员等众多其它的特性。

  • 分歧:然而 TC-39 组织内部对 ECMAScript4 草案产生了巨大的分歧,部分成员认为不应该一次性在第四版标准中加入过多的新功能,而来自雅虎、谷歌和微软的技术负责人则共同提交了一份 ECMAScript3.1 草案作为下一代 ECMAScript 的可选方案,其中此方案只是对现有标准进行小幅度的增量修改。行为更专注于优化属性特性、支持原生 JSON 以及为已有对象增加新的方法。

  • 从未面世的 ECMAScript4:2008 年,JavaScript 创始人 Brendan Eich 宣布 TC-39 委员一方面会将合理推进 ECMAScript3.1 的标准化工作,另一方面会暂时将 ECMAScript4 标准中提出的大部分针对语法及特性的改动搁置。

  • ECMAScript5:经过标准化的 ECMAScript3.1 最终作为 ECMA-262 第五版于 2009 年正式发布,同时被命名为 ECMAScript5。

  • ECMAScript6:在 ECMAScript5 发布后,TC-39 委员会于 2013 年冻结了 ECMAScript6 的草案,不再添加新的功能。2013 年 ECMAScript6 草案发布,在进过 12 个月各方讨论和反馈后。2015 年 ECMAScript6 正式发布,并命名为 ECMAScript 2015。

关于本书

充分理解 ECMAScript 6 功能是所有 JavaScript 开发人员前进的关键。 ECMAScript 6 中引入的语言功能代表了在可预见的未来构建 JavaScript 应用程序的基础。这就是本书的用武之地。我希望您能阅读本书来了解 ECMAScript 6 功能,以便在需要时立即开始使用它们。

浏览器与 Node.js 的兼容性

许多 JavaScript 环境(例如 Web 浏览器和 Node.js)正在积极致力于实现 ECMAScript 6。本书并不试图解决实现之间的不一致问题,而是重点关注规范定义的正确行为。因此,您的 JavaScript 环境可能不符合本书中描述的行为。

本书读者对象

本书旨在为那些已经熟悉 JavaScript 和 ECMAScript 5 的人提供指南。虽然使用本书不需要深入了解该语言,但它将帮助您理解 ECMAScript 5 和 6 之间的差异。本书面向在浏览器或 Node.js 环境中进行编程、希望了解该语言最新发展的中高级 JavaScript 开发人员。

本书不适合从未编写过 JavaScript 的初学者。您需要对该语言有很好的基本了解才能使用这本书。

概述

本书的十三章中的每一章都涵盖了 ECMAScript 6 的不同方面。许多章节首先讨论 ECMAScript 6 更改要解决的问题,为您提供这些更改的更广泛背景,并且所有章节都包含代码示例以帮助您学习新知识语法和概念。

第 1 章:块绑定如何工作讨论了 let 和 const,它们是 var 的块级替代品。

第 2 章:字符串和正则表达式涵盖了字符串操作和检查的附加功能以及模板字符串的介绍。

第 3 章:ECMAScript 6 中的函数讨论了函数的各种更改。这包括箭头函数形式、默认参数、剩余参数等等。

第 4 章:扩展对象功能解释了对象创建、修改和使用方式的变化。主题包括对象字面量语法的更改和新的反射方法。

第 5 章:解构以简化数据访问介绍了对象和数组解构,它允许您使用简洁的语法来分解对象和数组。

第 6 章:符号和符号属性介绍了符号的概念,这是一种定义属性的新方法。符号是一种新的原始类型,可用于隐藏(但不能隐藏)对象属性和方法。

第 7 章:Sets 和 Maps 详细介绍了新的集合类型 Set、WeakSet、Map 和 WeakMap。这些类型通过添加专为 JavaScript 设计的语义、重复数据删除和内存管理来扩展数组的实用性。

第 8 章:迭代器和生成器讨论向语言中添加迭代器和生成器。这些功能使您能够以强大的方式处理数据集合,这在以前版本的 JavaScript 中是不可能的。

第 9 章:JavaScript 类简介介绍了 JavaScript 中类的第一个正式概念。对于那些来自其他语言的人来说,这常常是一个困惑点,在 JavaScript 中添加类语法使得该语言更易于其他人使用,并且对于爱好者来说更简洁。

第 10 章:改进的数组功能详细介绍了对本机数组的更改以及在 JavaScript 中使用它们的有趣新方法。

第 11 章:Promise 和异步编程介绍了 Promise 作为该语言的新部分。Promise 是一项草根努力,由于扩展库的广泛支持,最终取得了成功并广受欢迎。ECMAScript 6 正式化了 Promise 并使其默认可用。

第 12 章:代理和反射 API 介绍了 JavaScript 的形式化反射 API 和新的代理对象,该对象允许您拦截对对象执行的每个操作。代理为开发人员提供了对对象前所未有的控制,因此为定义新的交互模式提供了无限的可能性。

第 13 章:用模块封装代码详细介绍了 JavaScript 的官方模块格式。目的是这些模块可以取代多年来出现的众多临时模块定义格式。

附录 A:较小的 ECMAScript 6 更改涵盖了 ECMAScript 6 中实现的其他更改,您将不经常使用这些更改,或者不太适合每章中涵盖的更广泛的主要主题。

附录 B:了解 ECMAScript 7 (2016) 描述了针对 ECMAScript 7 实现的标准的两项新增内容,它们对 JavaScript 的影响几乎没有 ECMAScript 6 那么多。