本书是一本简明的现代 JavaScript 教程,不仅涵盖函数式编程、JS 语法、JS 库等基础性内容,还介绍了国际化、异步编程、标准模块系统、元编程等较为复杂的内容,并附加了 TypeScript 的相关知识。部分章节根据其难度的不同设置了相应的图标,以便读者选择性学习。本书力求使初学者不被过时的 JavaScript 所困扰,能够在实践中高效地学会使用现代 JavaScript,既适合 JavaScript 初学者入门使用,也适合有一定基础的程序员进阶学习。
效率最优的学习捷径+完整覆盖的关键技术=全球编程语言教学大师的独具匠心||来自Core Java品牌保障的JS避坑大全
推荐序一
在过去的十年间,前端技术发展突飞猛进,各个领域异彩纷呈,对应框架层出不穷。从 HTML5 标准的诞生,到 Node.js 向服务端方向的爆发,再到前端MV(X)框架的百花齐放,还有可视化及互动领域的发展,以及各种无线技术的
融合和快速突破,前端领域变得越来越广,JavaScript 逐渐变得“无所不能”。
万丈高楼平地起,打好 JavaScript 基础非常重要。本书知识全面、深入浅出,非常适合初学者。作者结合自己的实践经验,精选了非常实用的例子,并提供了练习题,能够使初学者快速系统地掌握 JavaScript 底层原理,为以后前端编程实践打下扎实的基础。本书也适合 JavaScript 进阶编程者,书中介绍了作者的经验和技巧,还有许多 JavaScript 新特性和进阶内容,比如函数式编程、面向对象编程、国际化、异步编程、元编程、TypeScript 等,有助于进阶者查漏补缺,并快速掌握新特性。
本书的翻译成员来自国际体验技术团队,该团队由 AliExpress 前端和国际化中台前端组成,在长期的一线实践中,我们越发体会到掌握底层原理和及时更新特性的重要性。本书在内容上简洁明快、直击主题,“不费话”的风格在
市场上赢得了良好的口碑,所以我们最终选择翻译此书,期望本书能够帮助国内更多的 JavaScript 初学者和进阶者实现能力的快速提升。
——高级前端专家 万健
推荐序二
JavaScript 已是当今最热门的开发语言之一,具有强大的社区生态,在GitHub 的编程语言排名中持续名列前茅。与其他编程语言相比,JavaScript 具有自己的特点,在类型、面向对象、模块化、异步化等问题上都有着独特的思路
和特性。无论这些特性是好是坏、用户是否欣赏,都不妨碍 JavaScript 成为一门独具魅力的语言。
由于 JavaScript 的广泛使用,因此社区中涌现了一些框架/库,比如 React、Vue、Koa 等。使用这些框架/库来开发 JavaScript,能够显著提升开发效率和质量,但从个人学习 JavaScript 的角度,我更推荐不仅要会运用,还要掌握语言的原理和特性,而本书非常贴合这个目标。本书弱化了一些基础的编程知识,从JavaScript 语言的特性出发,利用 13 个章节,从基础到进阶,系统化地介绍了JavaScript 语言特性,每章附有练习题帮助读者进一步思考。无论是刚刚进入JavaScript 领域的初学者,还是具有一定经验的开发者,都能通过学习本书而有所收获。
本书的译者来自国际体验技术团队,他们有着丰富的 JavaScript 开发经验,解决过复杂且多样的技术和业务问题。他们结合自身的实践经验和感悟来翻译本书,在此过程中也对 JavaScript 有了更深刻的体会。
——资深前端专家 姜凡
推荐序三
Jeff Atwood 在 2007 年的一篇博客文章中提到:“任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来编写”,这就是著名的阿特伍德定律。
JavaScript 诞生于 1995 年,经过多年的升级和进化,其基于原型的编程模式、无需编译多范式解析执行的轻量化动态脚本、支持面向对象和声明式的编码风格,使它成为了灵活且充满魅力的编程语言。时至今日,无论是 JavaScript 开发者数量,还是社区生态的丰富程度,都处于编程语言前列。
全球互联网经历了 PC 时代和无线时代,JavaScript 已无处不在,掌握这门语言已经是互联网应用开发者的必备技能。近年来,JavaScript 不断涌现出新的类库、框架、脚手架。这些与日俱增的类库大大丰富了 JavaScript 的生态,也提高了研发效率,但我在日常工作中却发现,越来越多的开发者过度依赖现成的类库和框架来完成工作,由于对基础知识的掌握不成体系,缺乏对语言原理性的理解,他们在工作中举一反三、追本溯源定位问题的能力偏弱。
编程是一门实践的科学。本书结合 JavaScript 语言的特性,不仅讲解了JavaScript 的基础知识,还介绍了许多非常“接地气”的案例,既适合初学者打牢基础,也适合有经验的开发者提升实践技能。书中内容精炼不废话,专为“大
忙人”量身定制。
本书的翻译人员都是来自国际体验技术团队的优秀前端开发者,在复杂的国际业务场景中,具有极强的解决实际问题的能力。本书作者对 JavaScript 有深刻的理解,翻译团队具有多年的前端开发经验,相信二者的结合一定能为读者带来新的收获。
——资深前端专家 唐爽
译者序
我非常幸运地参与了本书的翻译过程。和 JavaScript 打交道多年,这是我第一次如此深入细致地阅读一本技术图书——从原版到译文,逐字逐句斟酌。当然,翻译也是二次学习的过程,通过翻译本书,我巩固了已经掌握的知识,获益颇多。
正如书名一样,本书紧跟 JS 的发展,没有对其历史进行赘述,而是直接讲解实用、流行的现代 JS,对学习 JS 或者由其他语言转向 JS 的读者都会有很大的帮助。同时,本书对 JS 知识点进行了分层,读者可以根据自己的掌握程度选择相应的章节来阅读,也可以将本书用于进阶学习。所谓千人千面,相信不同的读者可以在本书中看到不同深度的 JavaScript。
虽然我们在翻译过程中竭力追求“信、达、雅”,但限于译者自身的水平及经验有限,错漏和不足之处在所难免,恳请读者批评指正。
开卷有益,祝读者能在学习 JS 的过程中体会到更多的乐趣!
——刘哲聿
本书的内容与书名非常贴合,确实是写给大忙人看的,内容上做到了简明扼要、除旧布新。同时,书中包含了作者想传达给作者的一些经验技巧,这让我在翻译和审校的过程中有耳目一新的感觉。相信你在阅读的过程中也一定会
有同样的收获!
——陈新
前端技术不断推陈出新,前端从业者叫着“学不动了”,其根本原因在于“没时间+要学的内容太多”,而 “for 大忙人+精简”是本书的特征。我有幸参与此书的翻译工作,于我而言,翻译过程也是一个很好的学习过程,希望这本
书也能够帮助到各位读者。
——王志强
本书用大量篇幅阐述原理、剖析本质,旨在帮助读者建立正确的前端基础理论体系。“万丈高楼平地起,勿在浮沙筑高台”,互联网行业正在经历新一轮井喷式的发展,在诱惑面前不动声色,潜心钻研,才是成长为“前端大神”的唯一通途。
——孙承祚
如果你想要学习 JS 却苦于没有太多的时间,又希望能够比较全面地了解前端知识,那么本书是一个很好的选择。本书用简短的篇幅和精炼的语言阐释了前端知识及其新特性。在翻译校阅本书的过程中,我们也遵循了原书简明直接的宗旨。希望本书能对 JS 学习者有所帮助。
——陈松若
本书结合 ECMAScript 新特性,从语法到语言层面都给出了新颖有趣的阐述,并且每章结尾附有习题,有助于读者回顾章节中的知识。希望本书能帮助“大忙人” 读者理解并掌握这些新知识。
——张明
本书作者对 ECMAScript 标准的理解不只限于表面,而是深入标准背后的原因以及讨论过程。通过阅读此书,读者可以详细地了解这些标准的由来。希望本书可以帮助读者更深入地参与到社区建设中来。
——杨宇豪
如今国际化势头正盛,国际化意味着你的产品将有更多潜力,而本地化能让你的产品适用于各个特定的地区。本地化通常表现为多语言、多时区、多币种,本书是关于 JS 本地化的一个良好开端。
——毛训星
“高端的食材,往往只需要最朴素的烹饪方式”——优美的代码,只需要利用原生的数组和集合操作。
——黄劲森
化繁为简、深入浅出并非易事,这要求讲解者本身有着扎实的知识体系和深刻的理解能力。但本书的作者做到了!在试图让译文既易于理解又尽可能保持原著精髓的过程中,我也体会到了“温故知新”的含义。愿君悦读,终有收获。
——蒋慧
本书虽为“大忙人”所著,但并非简单的 API 堆砌。恰到好处的例子,附上启发式的习题,全书虽篇幅不长,却能帮助读者夯实基础。愿读者皆有所受益,这也是本书的意义所在。
——韩章裕
JS 语言变化非常之快,本书详细介绍了 JS 的最新语法,比如元编程模块,可以帮助读者修炼“内功”。同时,译者在翻译的过程中加入了一些自己的见解,力求内容通俗易懂。如果你能掌握本书的全部内容,我相信你会具备非常扎实的 JS 基础,并在前端世界中畅游。
——熊能
JS 更新迭代比较快,我在翻译时会发现自己之前对于某些内容的认识十分粗浅。英文原书的书名虽然是“for the Impatient”,但实际上,这也是一本很适合在现代浏览器上用作 Cookbook 的图书。
——苏州
TypeScript 在现代前端工程体系中有着举足轻重的地位,本书对于TypeScript 的介绍由浅入深,并从发展的角度探讨了如何设计和权衡 TS 接口。如果读者能够结合习题深入思考,相信一定能够对 TS 有更深刻的理解,并开发出代码精简、功能健全的代码库。
——姚丰
前 言
熟悉 Java、C#、C 和 C++等语言的经验丰富的程序员经常会发现,在某些场景下需要使用 JavaScript。越来越多的用户界面基于 Web 实现,而作为 Web浏览器的通用语言,JavaScript 显得尤为重要。不仅如此,Electron 框架还将其功能扩展到了富客户端应用程序中,并且有多种解决方案可用于生成移动JavaScript 应用程序。同时,JavaScript 在服务器端也越来越常见。
多年前,JavaScript 一直被认为是一种“小型”的编程语言,对大型程序来说,JavaScript 的特性集可能会造成混淆且容易出错。然而,标准化和各类工具产品的出现使 JavaScript 的发展远远超出了人们的预期。
不幸的是,初学者在学习现代的 JavaScript 时,却时常被过时的 JavaScript困扰。大多数的图书、课程和博客文章从较早版本的 JavaScript 开始讲起,这对从其他语言转向 JavaScript 的程序员来说帮助有限。
这就是本书要解决的问题。假设你(读者)是有一定基础的程序员,已了解分支和循环、函数、数据结构以及面向对象编程的基础知识,我会讲解如何高效地使用现代 JavaScript。对于一些过时的功能,我会为你使用括号进行注释。你将学习到如何在实践中使用现代 JavaScript,完全不用担忧历史问题。
JavaScript 也许并不完美,但已被证明非常适合用于用户界面编程和多种服务器端任务。正如 Jeff Atwood 的预言:“任何可以用 JavaScript 编写的应用程序最终都将用 JavaScript 编写。”
通过阅读本书,你能够学习到如何用现代 JavaScript 编写下一个版本的应用程序!
五条黄金法则
不使用 JavaScript 的部分“经典”功能可以大大减轻读者学习该语言的心理负担。对读者而言,下面这些规则可能暂时没什么意义,我暂且列出来,以便大家将来参考。放心,数量很少。
1.使用 let 或 const 代替 var 来声明变量。
2.使用严格模式(strict mode)编码。
3.明确类型并避免自动类型转换。
4.理解原型的概念,但使用类、构造函数和方法等现代语法实现对应的功能。
5.避免在构造函数或方法外使用 this。
还有一个公认的规则:避免使用 Wat 代码。Wat 代码就是那些令人困惑的JavaScript 代码,读者在研究后往往会发出讽刺性的感叹“Wat?!”。总有一些人喜欢通过剖析晦涩的代码来说明 JavaScript 适用性差,但实际上我们从那些代码“坑”里学不到什么有用的东西。例如,如果熟记黄金法则中的第 3 条“避免自动类型转换”,那么我们就没必要去研究“为什么 2 * ['21'] 是 42,但 2 + ['40']不是 42”了。总的来说,我们要尽量避免自己陷入这种毫无头绪的混乱境地,而不是试图去解释和理解那些无用的细节和原因。
学习途径
在写作本书时,我尽力梳理了内容和结构,以便读者查找阅读。为了帮助读者根据需求选择性地阅读,我用不同的图标标识了基础章节和高级章节。比默认章节更高级的章节会有相应的图标,读者可以在有一定基础储备之后再学
习高级章节。
图标介绍如下。
不耐烦的兔子代表基本内容,即使是最没耐心的读者也不应跳过。
爱丽丝(Alice)是大多数程序员都想深入了解的主题,但非必读内容。
Cheshire 猫表示本章节为进阶内容,可能对框架开发人员有所帮助。应用程序领域的大部分程序员可以忽略此部分。
最后,疯帽人表示该章节为复杂深奥的内容,主要针对那些希望深入研究探索的读者。
本书内容
第 1 章介绍 JavaScript 的基本概念,包括值、类型、变量,以及非常重要的对象字面量。第 2 章涵盖控制流的内容,熟悉 Java、C#或 C++语言的读者可以跳过此章。第 3 章介绍 JavaScript 中非常重要的部分——函数以及函数式编程,JavaScript 的对象模型与基于类的编程语言完全不同。第4 章深入细节,重点讨论现代 JS 语法。第 5 章和第 6 章涵盖了常用于处理数字、日期、字符串和正则表达式的库。以上章节主要为基础内容,包含少量的进阶内容。
接下来的 4 章均为中级内容。第 7 章介绍如何使用数组以及标准 JavaScript库提供的其他集合。如果你的程序需要与来自世界各地的用户进行交互,那么你需要特别关注第 8 章中有关国际化的内容。第 9 章主要讲解了异步编程的相
关内容,这对所有的程序员而言都是非常重要的。异步编程在 JavaScript 中曾经是非常复杂的话题,但随着 promises、async 和 await 等关键字的引入,异步编程也逐渐变得简单。第 10 章讨论 JavaScript 的标准模块系统,包括如何使用其他程序员编写的模块,以及如何生成自己的模块。
第 11 章主要介绍元编程,属于进阶内容。如果你要创建用于分析和转换任意 JavaScript 对象的工具,则需要阅读本章。第 12 章介绍 JavaScript 的另一个高级主题——迭代器和生成器,用于访问和创建任意值序列的强大机制。
第 13 章是附加章节,介绍了 TypeScript。TypeScript 是 JavaScript 的超集,它添加了编译时类型。它不是标准 JavaScript 的一部分,但是非常流行。阅读本章有助于读者确定是继续使用纯 JavaScript,还是使用流行的编译时类型。
本书的目的是帮助读者在 JavaScript 语言方面打下坚实的基础,使读者可以自信地使用 TypeScript。然而,读者还需要在其他地方寻找和跟进不断变化的工具和框架。
为什么写这本书
JavaScript 是全球最常用的编程语言之一。像许多程序员一样,我最初只懂JavaScript 的一点皮毛,直到某一天需要快速地学习严谨的 JavaScript,这时,问题来了:怎么去学呢?
很多书只给 Web 开发者介绍一点点 JavaScript,但其实我已经对其有了一定的了解。1996 年,戴维·弗拉纳根(David Flanagan)的犀牛系列(Rhino)图书很畅销,但由于各种历史原因,如今读者读起来已经“不堪重负”。2008 年,道格拉斯·克罗克福德(Douglas Crockford)的 JavaScript:The Good Parts 是不错的 JavaScript 入门书,但是书中很多内容已在随后的语言更改中被同化。很多图书让那些使用老式 JavaScript 的程序员学习现代标准,但我并不认同这些书中部分所谓“经典”的 JavaScript。
当然,网络上充斥着质量参差不齐的 JavaScript 主题博客,有些内容准确,但更多的内容对于本质的理解并不准确,因此这种通过在网上搜索博客再评估其真实性水平的学习方式效率太低了。
奇怪的是,我找不到一本没有历史包袱的、面向数百万懂 Java 或类似语言并且想学习 JavaScript 的程序员的书,因此我决定编写本书。
致谢
再次感谢编辑 Greg Doench 支持该项目,感谢 Dmitry Kirsanov 和 Alina Kirsanova 对本书进行编辑和排版。 特别感谢审稿人 Gail Anderson、Tom Austin、Scott Davis、Scott Good、Kito Mann、Bob Nicholson、Ron Mak 和 Henri Tremblay提出的校对和改进建议。
Cay Horstmann Berlin 2020 年 3 月