Effective Javascript:编写高质量JavaScript代码的68个有效方法 英文版
  • 推荐0
  • 收藏4
  • 浏览1.1K

Effective Javascript:编写高质量JavaScript代码的68个有效方法 英文版

(美)David Herman(大卫·赫尔曼) (作者)  无 (译者) 刘芸 (责任编辑)

  • 丛  书:原味精品书系
  • 书  号:978-7-121-27303-2
  • 出版日期:2016-04-05
  • 页  数:224
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 原书名: Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript
  • 原书号:0321812182
  • 维护人:刘佳禾
本书由资深 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,对于她的付出我无以为报。

目录

推荐序
前言
致谢
关于作者
Chapter 1: Accustoming Yourself to JavaScript
Item 1: Know Which JavaScript You Are Using
Item 2: Understand JavaScript’s Floating-Point Numbers
Item 3: Beware of Implicit Coercions
Item 4: Prefer Primitives to Object Wrappers
Item 5: Avoid using == with Mixed Types
Item 6: Learn the Limits of Semicolon Insertion
Item 7: Think of Strings As Sequences of 16-Bit Code Units
Chapter 2: Variable Scope
Item 8: Minimize Use of the Global Object
Item 9: Always Declare Local Variables
Item 10: Avoid with
Item 11: Get Comfortable with Closures
Item 12: Understand Variable Hoisting
Item 13: Use Immediately Invoked Function Expressions to Create Local Scopes
Item 14: Beware of Unportable Scoping of Named Function Expressions
Item 15: Beware of Unportable Scoping of Block-Local Function Declarations
Item 16: Avoid Creating Local Variables with eval
Item 17: Prefer Indirect eval to Direct eval
Chapter 3: Working with Functions
Item 18: Understand the Difference between Function, Method, and Constructor Calls
Item 19: Get Comfortable Using Higher-Order Functions
Item 20: Use call to Call Methods with a Custom Receiver
Item 21: Use apply to Call Functions with Different Numbers of Arguments
Item 22: Use arguments to Create Variadic Functions
Item 23: Never Modify the arguments Object
Item 24: Use a Variable to Save a Reference to arguments
Item 25: Use bind to Extract Methods with a Fixed Receiver
Item 26: Use bind to Curry Functions
Item 27: Prefer Closures to Strings for Encapsulating Code
Item 28: Avoid Relying on the toString Method of Functions
Item 29: Avoid Nonstandard Stack Inspection Properties
Chapter 4: Objects and Prototypes
Item 30: Understand the Difference between prototype, getPrototypeOf, and__proto__
Item 31: Prefer Object.getPrototypeOf to __proto__
Item 32: Never Modify __proto__
Item 33: Make Your Constructors new-Agnostic
Item 34: Store Methods on Prototypes
Item 35: Use Closures to Store Private Data
Item 36: Store Instance State Only on Instance Objects
Item 37: Recognize the Implicit Binding of this
Item 38: Call Superclass Constructors from Subclass Constructors
Item 39: Never Reuse Superclass Property Names
Item 40: Avoid Inheriting from Standard Classes
Item 41: Treat Prototypes As an Implementation Detail
Item 42: Avoid Reckless Monkey-Patching
Chapter 5: Arrays and Dictionaries
Item 43: Build Lightweight Dictionaries from Direct Instances of Object
Item 44: Use null Prototypes to Prevent Prototype Pollution
Item 45: Use hasOwnProperty to Protect Against Prototype Pollution
Item 46: Prefer Arrays to Dictionaries for Ordered Collections
Item 47: Never Add Enumerable Properties to Object.prototype
Item 48: Avoid Modifying an Object during Enumeration
Item 49: Prefer for Loops to for...in Loops for Array Iteration
Item 50: Prefer Iteration Methods to Loops
Item 51: Reuse Generic Array Methods on Array-Like Objects
Item 52: Prefer Array Literals to the Array Constructor
Chapter 6: Library and API Design
Item 53: Maintain Consistent Conventions
Item 54: Treat undefined As “No Value”
Item 55: Accept Options Objects for Keyword Arguments
Item 56: Avoid Unnecessary State
Item 57: Use Structural Typing for Flexible Interfaces
Item 58: Distinguish between Array and Array-Like
Item 59: Avoid Excessive Coercion
Item 60: Support Method Chaining
Chapter 7: Concurrency
Item 61: Don’t Block the Event Queue on I/O
Item 62: Use Nested or Named Callbacks for Asynchronous Sequencing
Item 63: Be Aware of Dropped Errors
Item 64: Use Recursion for Asynchronous Loops
Item 65: Don’t Block the Event Queue on Computation
Item 66: Use a Counter to Perform Concurrent Operations
Item 67: Never Call Asynchronous Callbacks Synchronously
Item 68: Use Promises for Cleaner Asynchronous Logic
Index

读者评论

同系列书

  • Clean Architecture:软件架构与设计匠艺(英文版)

    Robert C. Martin (作者) Robert C. Martin(罗伯特·C·马丁) (译者)

    马丁的简介代码不仅仅是提供选项。在半个世纪的软件环境中,每一种可以想象的类型,马丁告诉你做出什么选择,以及为什么它们对你的成功至关重要。正如你所渴望的,这本书中...

     
  • Effective Java(第2版)英文版

    (美)Joshua Bloch(约书亚·布洛赫) (作者) 无 (译者)

    本书通过78个有效案例,旨在帮助读者深入理解Java,以写出更加清楚、健壮、可重复使用的代码。书中每个章节均包含小论文,针对Java平台和杰出的代码样例,提供了...

    ¥65.00
  • C11编程导论英文版

    (美)Paul Deitel(保罗·戴特尔),(美) Harvey Deitel(哈维·戴特尔) (作者) (译者)

    本书沿用了Deitel特色的“程序实况解说”,深入探讨了C语言和C标准库。通过完整的语法着色、代码高亮、代码演练和程序输出,全面地介绍了测试程序的概念。本书汇集...

    ¥89.00
  • Effective Javascript:编写高质量JavaScript代码的68个有效方法 英文版

    (美)David Herman(大卫·赫尔曼) (作者) 无 (译者)

    本书由资深 JavaScript 技术专家 David Herman 所著。书中基于 JavaScript 标准的新版本前所未有地阐明了 JavaScript ...

    ¥65.00
  • Effective Python:编写高质量Python代码的59个有效方法 英文版

    (美)Brett Slatkin(布雷特·斯拉特金) (作者) 无 (译者)

    本书不是要讲述 Python 的基础编程,而是要帮你掌握 Python 独特的优势和魅力。书中总结了 59个 Python 编程的优秀实践、贴士和捷径,并用真实...

    ¥65.00

相关图书

大型JavaScript应用最佳实践指南

Adam Boduch (作者) 黄小璐 (译者)

本书将带你设计和实现能从多个维度(如寻址能力、可配置性和性能)可伸缩的JavaScript的应用程序体系架构;了解常见的JavaScript缩放陷阱,并通过真实...

¥65.00

基于MVC的JavaScript Web富应用开发

Alex MacCaw(亚历克斯·麦卡劳) (作者) 李晶 (译者)

在琳琅满目的Web富客户端应用实现方式中,JavaScript在其中巧妙地穿针引线,扮演着"黏合剂”的作用。JavaScript与各种浏览器插件技术(Silve...

¥39.00

Learning TypeScript中文版

Remo H. Jansen (作者) 龙逸楠 (译者)

本书首先介绍了TypeScript 的基本语法和基本的自动化工作流配置方法,然后从面向对象入手,着重介绍了面向对象的概念和它的一些最佳实践,并结合例子讲解了如何...

¥89.00

实战ES2015:深入现代JavaScript 应用开发

甘超阳 (作者)

JavaScript在ES2015标准中的表现,以及利用ES2015中新特性在JavaScript应用开发中的实践。以清晰的思路说明ES2015的详细特性和意义...

¥49.00

高性能JavaScript

Nicholas C. Zakas(尼古拉斯.泽卡斯) (作者) 丁琛 丁琛 (译者)

浏览器解释执行JavaScript 程序时不会对代码进行优化,因此代码的结构极大地影响着程序的运行速度。本书分享高效的代码结构和开发模式,帮助读者获得更好的程序...

¥39.00