JavaScript语言精粹(修订版)
JavaScript语言精粹(修订版)
(美)克罗克福德(Crockford,D.)著
赵泽欣,鄢学鹍译
ISBN978-7-121-17740-8
2012 年8 月出版
定价:49.00 元
16开
172页
宣传语
深入挖掘JavaScript精华
内 容 简 介
JavaScript 曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,也证明了它其实是一门优秀的语言。Douglas Crockford 在本书中剥开了JavaScript沾污的外衣,抽离出一个具有更好可靠性、可读性和可维护性的JavaScript 子集,让你看到一门优雅的、轻量级的和非常富有表现力的语言。作者从语法、对象、函数、继承、数组、正则表达式、方法、样式和优美的特性这9 个方面来呈现这门语言真正的精华部分,通过它们完全可以构建出优雅高效的代码。作者还通过附录列出了这门语言的毒瘤和糟粕部分,且告诉你如何避免它们。最后还介绍了JSLint,通过它的检验,能有效地保障我们的代码品质。
这是一本介绍 JavaScript 语言本质的权威书籍,值得任何正在或准备从事JavaScript 开发的人阅读,并且需要反复阅读。学习、理解、实践大师的思想,我们才可能站在巨人的肩上,才有机会超越大师,这本书就是开始。
再版译者序
直到重看第1 版的译者序,我才意识到,不知不觉时间竟然已经过去快4 年了。
这段不长也不短的时间里,发生了很多事,请容我语无伦次地列举出来。
在这 4 年里,JavaScript 的发展丝毫没有减速的迹象,随着新一轮的浏览器竞赛,HTML5逐渐得到普及,JavaScript在Web 开发领域中的地位日益提高。NodeJS的出现,更是让JavaScript 蔓延到服务器端编程领域。还值得一提的是2 年多以前CoffeeScript 的诞生,它吸收了JavaScript语言的精华,去除了很多本书中提到的毒瘤和糟粕,还添加了很多现代脚本语言的特性,仿佛就是老道(我们私下里这样尊称本书的作者Douglas Crockford)所想要的JavaScript 精华子集。老道本人也确实对它推崇有加。
已经 10 年未有重大版本发布的ECMA,终于在2009 年年底发布ECMA-262 的第5 个版本(ES5),这个版本在最后时刻取代了过于激进的ED4(JavaScript2.0),据说老道的倡议起了重大的作用。谢天谢地,我真不愿意像写Java 一样写JavaScript。本书中的一些精华也被ES5 采纳,比如JSON 成为ES5 的标准组件;再比如ES5 支持“严格”模式,在此模式下,使用未声明的全局变量或者with 语句,都会抛出错误。下一代的ES 版本(ES6)正在制定中,它的名字是我们无比熟悉的“Harmony(和谐)”,期待更多本书中的优秀思想会出现在ES6 中。
2009 年,在北京举行的Qcon 大会上,我和学鹍有幸遇到了老道,并和他合影留念。他比我想象中高大,留着拉风的络腮胡子(后来我看到了他未留胡子的照片,觉得老道还是留胡子的好)。人很安静,看上去有那么一点技术人员的木讷。但站在演讲台上却是侃侃而谈,掷地有声。
于我而言,这4 年我的人生同样发生了重大的变化。我结了婚,装修了房子,在去年年底,我的孩子也降生了。
……
就此打住吧,我快要走题了。这次修订的版本,对照中英文的勘误,修正了80 余个错误。一些已经过时的经验和数据,我们也尽所能通过译者注进行了标注。作为一名译者,忠实地翻译本书的内容本是职责。在翻译的过程中,我们曾遇到一些与自己的开发经验有冲突的部分。我也在不同场合多次听闻国内外的业界同行,对本书的部分内容提出了不同的看法,有人认为本书一些观点不是JavaScript 的最佳实践,有人甚至言辞激烈地说有些观点根本就是老道的个人主观看法,而非科学的求证。
在我眼里,我觉得我的孩子是世界上最漂亮的宝宝,天下的父母怕是都无法完全客观地看待自己的孩子。我相信老道视他提炼的JavaScript 子集,就如同我看自己的孩子。其实,老道在本书的最开头,就已经表明:本书内容是他根据自己的经验提炼的精华子集。也许,每个开发人员对何谓精华、何谓糟粕有自己的看法。但我想,JavaScript 还会不停地发展下去,本书中的内容也许还需要多次修订,但“取其精华,弃其糟粕”的思想是不会过时的。
我的孩子,就遗传了我和太太的精华,如果一定要说有一点是糟粕的话,那就是他没有继承我喜欢安静的优点,每天不闹到精疲力尽就不肯睡去。所以,我只有在孩子晚上熟睡后,才有得闲暇写下断续的文字。
感谢本修订版的策划编辑张春雨老师,他容忍了我的多次跳票,请原谅一个迷恋孩子的父亲。
2012 年8 月5 日码字于杭州
译者序
Douglas Crockford 是一位大师。
翻译大师的作品,一边是感到万分的荣幸,一边也是兢兢小心。因为吉尔伯特·海特(美国教育家)曾经说过:写了一本很糟糕的书只是犯错而已,而把一本好书翻译得很糟糕则是犯罪。但这样的大师经典之作,即便是冒着犯罪的风险,也值得翻译出来并推荐给大家。一直到现在,依然有很多资深的开发人员对JavaScript 存有偏见。秦歌和我,分别负责雅虎口碑网和淘宝网的前端开发组,对此的感受更为深刻。但即便如此,也不得不承认,JavaScript正日益成为互联网中最普及和最重要的开发语言。
Crockford 曾写过很著名的一篇文章——《JavaScript:世界上最被误解的语言》。建议看到这里的所有读者都找来这篇文章(http://javascript.crockford.com/javascript.html)并仔细阅读。早期的商业原因和规范欠缺给JavaScript 这门语言蒙上了阴影;Copy+Paste式滥用也让JavaScript 显得廉价不堪;更糟糕的是,还有大量不负责任的书籍把蹩脚的用例奉为正统,印成了铅字,让新手们从一开始就走上了歧途。不可否认,JavaScript 自身确实存在着不少瑕疵,但瑕不掩瑜。Crockford为此凭借他广博的学识和丰富的经验提炼出了JavaScript 的精华子集。开发人员只要在这个子集的范畴中编程,就既能使用JavaScript 强大的表现力和卓越的动态性,又能免去许多无端的调试烦恼和安全隐忧。
这本书很薄,但承载的内容却非常丰厚和深入。翻译的过程中我也常感汗颜,原来自诩对JavaScript 颇为了解的我深刻感受到自己知识面的浅薄和不完整,于是翻译的过程也成为自己检讨和学习的过程,收获颇丰。Crockford 在前言中告诫大家,这本书是需要反复阅读的。我们同样推荐所有的读者这样做。
我想每一个热爱技术的开发人员都希望自己有一天成为某个领域的大师。我通过翻译大师的著作也得到了一个启示,“取其精华,去其糟粕”本就是前人告诉我们的学习态度与方法,对日新月异的IT 领域来说更该如此。当我们面对这些层出不穷的新技术、新理念时,不要匆忙地照单全收或全盘否定。找到最适合工作或自己最感兴趣的技术,并用科学的方法潜下心来坚持学习和研究,我们同样也可以成为大师!
“大师牛人,宁有种乎?”
最后,我要感谢博文视点的编辑赵士威在本书翻译过程中给予我们的莫大帮助。还有周筠老师,她爽朗的笑声让人备感亲切。我还要感谢我的同事,来自美国NCSU 的晓荷,是博采中外的她给我建议,把JavaScript的“好、中、坏”特性翻译为更贴切的“精华、鸡肋、糟粕”。当然,家中的领导(负责接管稿费)是一定要特别感谢的。相信我,如果你身后没有一位善解人意的女人,还是不要去做翻译的好。
译者:赵泽欣(小马),鄢学鹍(秦歌)
2008 年11 月于杭州城西
前 言
要是有所得罪请原谅。本是出自一番好意,
只是想显点粗浅技艺,那才是我们的初衷。
——威廉·莎士比亚,《仲夏夜之梦》(AMidsummer Night’s Dream)
这是一本关于JavaScript 编程语言的书。它的读者是那些因为偶然事件或好奇心驱使而首次冒险进入JavaScript 世界的程序员。它也是为那些有着JavaScript入门经验但准备更深入了解这门语言的程序员准备的。JavaScript 是一门强大得令人惊讶的语言。它有时会不按常理出牌,但是作为一门轻量级的语言,它是易于掌握的。
本书的目标是帮助你学习JavaScript 的编程思想。我将展示这门语言的组成部分,并且让你逐步上手,学会如何组合各个部分。这不是一本参考书,它不会对这门语言和它的怪癖进行全面而详尽的介绍。它不包含你希望知道的一切,那些东西你很容易在网上找到。反之,这本书仅包含那些真正重要的东西。
这本书不是写给初学者的。我希望某天写一本叫《JavaScript:第一阶段》(JavaScript:The FirstParts)的书,但是此书非彼书。这也不是一本关于Ajax 或Web 编程的书。本书关注的就是JavaScript,它只是Web 开发者必须掌握的语言之一。
这不是一本傻瓜书。这本书虽然薄,但知识点密集,它包括了大量的内容。如果为了理解它而不得不反复阅读,请别沮丧,你的付出将会有所回报。
目 录
前言................................................................................................................................xv
第1 章 精华..................................................................................................................1
为什么要使用JavaScript .......................................................................................................2
分析JavaScript......................................................................................................................2
一个简单的试验场.................................................................................................................4
第2 章 语法..................................................................................................................5
空白.......................................................................................................................................5
标识符...................................................................................................................................6
数字.......................................................................................................................................7
字符串...................................................................................................................................8
语句.....................................................................................................................................10
表达式.................................................................................................................................15
字面量.................................................................................................................................18
函数.....................................................................................................................................19
第3 章 对象................................................................................................................20
对象字面量..........................................................................................................................20
检索.....................................................................................................................................21
更新.....................................................................................................................................22
引用.....................................................................................................................................22
原型.....................................................................................................................................22
反射.....................................................................................................................................23
枚举.....................................................................................................................................24
删除.....................................................................................................................................24
减少全局变量污染...............................................................................................................25
第4 章 函数................................................................................................................26
函数对象..............................................................................................................................26
函数字面量..........................................................................................................................27
调用.....................................................................................................................................27
参数.....................................................................................................................................30
返回.....................................................................................................................................31
异常.....................................................................................................................................31
扩充类型的功能...................................................................................................................32
递归.....................................................................................................................................33
作用域.................................................................................................................................36
闭包.....................................................................................................................................36
回调.....................................................................................................................................39
模块.....................................................................................................................................40
级联.....................................................................................................................................42
柯里化.................................................................................................................................43
记忆.....................................................................................................................................43
第5 章 继承.................................................................................................................46
伪类.....................................................................................................................................46
对象说明符..........................................................................................................................49
原型.....................................................................................................................................50
函数化.................................................................................................................................51
部件.....................................................................................................................................55
第6 章 数组.................................................................................................................57
数组字面量..........................................................................................................................57
长度.....................................................................................................................................58
删除.....................................................................................................................................59
枚举.....................................................................................................................................59
容易混淆的地方...................................................................................................................60
方法.....................................................................................................................................60
指定初始值..........................................................................................................................62
第7 章 正则表达式.....................................................................................................64
一个例子..............................................................................................................................65
结构.....................................................................................................................................69
元素.....................................................................................................................................71
第8 章 方法.................................................................................................................77
Array ....................................................................................................................................77
Function...............................................................................................................................83
Number................................................................................................................................84
Object...................................................................................................................................85
RegExp................................................................................................................................86
String....................................................................................................................................88
第9 章 代码风格........................................................................................................94
第10 章 优美的特性...................................................................................................98
附录A 毒瘤...............................................................................................................101
附录B 糟粕...............................................................................................................109
附录C JSLint.............................................................................................................115
附录D 语法图...........................................................................................................127
附录EJSON...............................................................................................................138
索引..............................................................................................................................149