本书由资深 JavaScript 技术专家 David Herman 所著。书中基于 JavaScript 标准的新版本前所未有地阐明了 JavaScript 语言的内部运作机制——帮助你充分利用 JavaScript 语言的表现力。通过全书归纳的 68 个行之有效的方法和大量具体实例,作者详细讲解了如何更有效地运用这门灵活且富有表现力的语言,以及如何规避其缺陷。你将学到如何选择正确的编程风格,管理一些超出意料的问题,以及成功使用 JavaScript 编程完成从数据结构到并发的方方面面。
无论你写了多久的 JavaScript 代码,本书都将有助于增进你对这门强大的编程语言的理解,助你编写更可预测、更可靠且具维护性的程序。
JavaScript标准化委员会专家撰写,68个实用方法|具体实例,众JavaScript名家联袂力荐
推荐序
众所周知,我在1995年5月用10天时间创建了JavaScript语言。迫于现实的压力和冲突管理的势在必行,我将JavaScript设计为“看起来像Java”、“对初学者来说极简单”、“在网景浏览器中几乎能控制它的一切”的编程语言。
鉴于极具挑战性的要求和非常短的时间表,我的解决方案除了正确获得了两大特性(第一类函数、对象原型)之外,还将JavaScript设计得从一开始就极具延展性。我知道一些开发者不得不为最开始的几个版本“打补丁”来修正错误,这些先驱的方法比我使用内置库胡乱拼凑的方法要好。举例来说,虽然许多编程语言都限制了可变性,在运行时不能修改或扩展内置对象,或者标准库的名称绑定不能通过赋值被覆盖,但是JavaScript几乎允许完全改变每个对象。
总的来说,我相信这是一个很好的设计决定。它明确了某些领域的挑战(如在浏览器的安全边界内,安全地混用可信和不可信的代码)。对于JavaScript来说,支持所谓的猴子补丁是很重要的。凭借它,开发者可以编辑标准对象来解决Bug和仿效“未来”的功能改造一些旧的浏览器(称为polyfill库的shim,在美式英语中称为spackle)。
除了这些平凡的应用之外,JavaScript的可塑性鼓励用户沿着几个更富有创造性的方向形成和发展创新网络。这使得用户仿效其他编程语言,创建了许多工具包和框架库:基于Ruby的Prototype、基于Python的MochiKit、基于Java的Dojo及基于Smalltalk的TIBET。随后是jQuery库(“JavaScript的新浪潮”),2007年,我第一次看到它,我觉得自己似乎是一个后来者。它暴风雨般地引领着JavaScript的世界,异于其他编程语言,从旧的JavaScript库中学习,开辟了浏览器的“查询和做”(query and do)模型,从根本上简化了浏览器。
这引领着JavaScript用户群及其创新网络,使JavaScript的风格自成一派。这种风格仍在仿效和简化其他的程序库,也促成了现代Web标准化的工作。
在这一演变过程中,JavaScript保持了向后兼容,当然默认情况下,它是可变的。另外,在ECMAScript标准最新的版本中新增了一些方法来冻结对象和封闭对象的属性,以防止对象扩展和属性被覆盖。JavaScript的演进之旅远未结束。这就像生活的语言和生物系统一样,变化始终存在。在此之前,我无法预见一个单一的横扫其他程序库的“标准库”或编码风格。
任何语言都是怪癖的,或者语言几乎都是受限地执行常见的上佳实践。JavaScript是一门怪癖的或者充满限制主义色彩的编程语言。因此,与大多数其他的编程语言相比,想要高效地使用JavaScript编程,开发人员必须学习和追求优秀的风格、正确的用法和上佳的实践。当考虑如何做到最高效,我相信避免过度编程和构建刚性或教条式的风格指南是至关重要的。
本书以一种平衡的方式讲解JavaScript编程。它基于一些具体的实证和经验,而不迂回于刚性或过度的方法。我认为对于许多寻找在不牺牲表现力的前提下,还可以自由采用新思想和编程范式来编写高效JavaScript的人来说,本书是一位重要的助手和可信赖的向导。它也是一本备受关注、充满乐趣和拥有许多令人叹为观止的示例的读物。
最后,自2006年以来,我有幸结识David Herman。那是我第一次以Mozilla代表的身份邀请他作为特邀专家在Ecma标准化机构工作。Dave深刻、谦逊的专家意见及他的热情让JavaScript在书中的每一页大放异彩。本书精彩绝伦!
——Brendan Eich
前言
学习一门编程语言,需要熟悉它的语法、形式和结构,这样我们才能编写合法的、符合语义的、具有意义和行为正确的程序。但除此之外,掌握一门语言需要理解其语用,即使用语言特性构建高效程序的方法。后一种范畴是特别微妙的,尤其是对JavaScript这样一种灵活而富有表现力的编程语言来说。
这是一本关于JavaScript语用学的书。这不是一本入门书籍,我假设你已经在一定程度上熟悉了JavaScript和通常的编程。有很多优秀的JavaScript入门书籍可供参考,例如,Douglas Crockford的《JavaScript语言精粹》和Marijn Haverbeke的《JavaScript编程精解》。本书的目的是帮助你加深理解如何有效地使用JavaScript构建更可预测、可靠和可维护的JavaScript应用程序和库。
JavaScript与ECMAScript
在深入阅读本书之前向你澄清一些术语是很有必要的。这是一本关于举世皆知的JavaScript编程语言的书籍。然而,该语言官方标准定义的规范的名称是ECMAScript。历史很令人费解,但这可以归结为版权问题:由于法律原因,Ecma国际标准化组织不能使用“JavaScript”作为其标准名称。更糟的是,标准化组织将其原来的名称ECMA(“欧洲计算机制造商协会”的英文首字母缩写)改为不是全大写的Ecma国际标准化组织。在那时,ECMAScript这个名字大约也就注定了。
正式来说,当人们提到ECMAScript时,通常是指由Ecma国际标准化组织制定的“理想”语言。与此同时,JavaScript这个名字意味着来自语言本身的所有事物,例如某个供应商特定的JavaScript引擎。通常情况下,这两个术语是通用的。为了保持清晰度和一致性,在本书中,我将只使用ECMAScript来谈论官方标准,使用JavaScript指代语言,另外,使用常见的缩写ES5来指代第5版的ECMAScript标准。
关于Web
避开Web来谈JavaScript是很难的。到目前为止,JavaScript是唯一为用于客户端应用程序脚本的所有主流浏览器提供内置支持的编程语言。此外,近年来,随着Node.js平台的问世,JavaScript已经成为一门实现服务器端应用程序的流行编程语言。
不过,本书是关于JavaScript而非Web的编程。有时,谈论一些Web相关的例子和应用程序的概念是为了帮助读者理解。但是,这本书的重点是JavaScript语言的语法、语义和语用,而不是Web平台的API和技术。
关于并发
JavaScript一个新奇的方面是在并发环境中其行为是完全不明朗的。ECMAScript标准(包括第5版)关于JavaScript程序在交互式或并发环境中的行为只字未提。第7章涉及并发,因此,我只是从技术角度介绍一些非官方的JavaScript特性。但实际上,所有主流的JavaScript引擎都有一个共同的并发模型。尽管在标准中未提及并发,但是致力于并发和交互式的程序是JavaScript编程的一个核心概念。事实上,未来版本的ECMAScript标准可能会正式地标准化这些JavaScript并发模型的共享方面。
致谢
这本书在很大程度上要归功于JavaScript的发明者——Brendan Eich。我非常感谢Brendan能邀请我参与JavaScript标准化工作,并对我的Mozilla职业生涯给予指导和支持。
本书中的大部分材料是受优秀的博客文章和在线论文的启发。我从Ben “cowboy” Alman、Erik Arvidsson、Mathias Bynens、Tim “creationix” Caswell、Michaeljohn “inimino” Clement、Angus Croll、Andrew Dupont、Ariya Hidayat、Steven Levithan、Pan Thomakos、Jeff Walden,以及Juriy “kangax” Zaytsev的博客中学到很多东西。当然,本书的最终资源来自ECMAScript规范。ECMAScript规范自第5版以来由Allen Wirfs-Brock不知疲倦地编辑和更新。Mozilla开发者网络仍然是JavaScript API和特性最令人印象深刻的、高品质的在线资源之一。
在策划和写作这本书的过程中,我有许多顾问。在我开始写作之前,John Resig就以作者的角度给了我很多有用的建议。Blake Kaplan和Patrick Walton在早期阶段帮我整理想法和规划这本书的组织结构。在写作的过程中,Brian Anderson、Norbert Lindenberg、Sam Tobin-Hochstadt、Rick Waldron和Patrick Walton给了我很好的建议。
很高兴能够和Pearson的工作人员共事。Olivia Basegio、Audrey Doyle、Trina MacDonald、Scott Meyers和Chris Zahn一直关注我提出的问题,对我的拖延报以耐心,并通融我的请求。我无法想象还能有比这更愉快的写作经历。我对能为Effective系列写一本书感到非常荣幸。因为很久以前我就是Effective C++的粉丝,也曾经怀疑自己是否有亲自书写一本Effective系列书籍的荣幸。
我也简直不敢相信自己有这样的好运气,能够找到梦之队一样的技术编辑。我很荣幸Erik Arvidsson、Rebecca Murphey、Rick Waldron和Richard Worth同意编辑这本书,他们为我提供了许多宝贵的批评和建议。他们多次纠正了书中一些真正令人尴尬的错误。
写一本书比我预想的要难得多。如果不是朋友和同事的支持,我可能已经失去了勇气。在我怀疑自己的时候,Andy Denmark、Rick Waldron和Travis Winfrey总是给予我鼓励。
我绝大部分时候是在旧金山柏丽附近的神话般的Java Beach咖啡厅里写作这本书的。那里的工作人员都知道我的名字,并且不等我点餐,他们就知道我想要点什么。我很感谢他们提供了一个舒适的工作场所,并给我提供食物和咖啡。
我的毛茸茸的猫科小友Schmoopy为本书做出了它的最大贡献。至少,它不停地跳上我的膝盖,坐在屏幕前(有可能是笔记本电脑比较温暖)。Schmoopy自2006年以来一直是我的忠实伙伴,我不能想象没有小毛球的生活。
我的整个家庭对这个项目自始至终都很支持,并充满期待。遗憾的是,我无法在我的爷爷和奶奶(Frank和Miriam Slamar)去世之前和他们分享这本书的成品。但他们会为我感到激动和自豪,而且本书中有一小段我儿时与爷爷Frank编写BASIC程序的经历。
最后,我要感谢我一生的挚爱Lisa Silveria,对于她的付出我无以为报。