# 编写高质量 JavaScript 的 68 个有效方法

编写高质量 JavaScript 的 68 个有效方法

# 第1章. 让自己习惯 JavaScript

JavaScript最初设计令人感觉亲切。由于其语法让人联想到Java,并且具有许多脚本语言的共同特性(如函数、数组、字典和正则表达式),因此,具有少量编程经验的人也能够快速学习JavaScript。新手程序员几乎不需要培训就可以开始编写程序,这要归功于JavaScript语言提供的为数不多的核心概念。

虽然JavaScript是如此的平易近人,但是精通这门语言需要更多的时间,需要更深入地理解它的语义、特性以及最有效的习惯用法。本书每个章节都涵盖了高效JavaScript编程的不同主题。第1章讲述一些最基本的主题。

# 1.了解你使用的 JavaScript 版本

# 2.理解 JavaScript 的浮点数

# 3.当心隐式的强制转换

# 4.原始类型优于封装对象

# 5.避免对混合类型使用===运算符

# 6.了解分号插入的局限

# 7.视字符串为 16 位的代码单元序列

# 第2章. 变量作用域

作用域对于程序员来说就像氧气。它无处不在,甚至,你往往不会去特意想它。但当它被污染时,你会感觉到窒息。

好消息是JavaScript核心的作用域规则很简单。其作用域规则被精心设计,且强大得令人难以置信;但也有一些例外。有效地使用JavaScript需要掌握变量作用域的一些基本概念,并了解一些可能导致难以捉摸又令人生疑的极端情况。

# 8.尽量少用全局对象

# 9.始终声明局部变量

# 10.避免使用 with

# 11.熟练掌握闭包

# 12.理解变量声明提升

# 13.使用立即调用的函数表达式创建局部作用域

# 14.当心命名函数表达式笨拙的作用域

# 15.当心局部函数声明笨拙的作用域

# 16.避免使用 eval 创建局部变量

# 17.间接调用 eval 函数优于直接调用

# 第3章. 使用函数

函数是JavaScript中的“第一公民”,既给程序员提供了一些主要的抽象功能,又提供了实现机制。函数可以独自实现其他语言中的多个不同特性,例如:过程、方法、构造函数,甚至类和模块。一旦你熟悉了函数的具体细节,你就掌握了JavaScript的重要组成部分。然而凡事都有两面性,学会在不同的环境中高效地使用函数是需要下一番功夫的。

# 18.理解函数调用、方法调用及构造函数调用之间的不同

# 19.熟练掌握高阶函数

# 20.使用 call 方法自定义接受者来调用方法

# 21.使用 apply 方法通过不同数量的参数调用函数

# 23.永远不要修改 arguments 对象

# 24.使用变量保存 arguments 的引用

# 25.使用 bind 方法提取具有确定接收者的方法

# 26.使用 bind 方法实现函数柯里化

# 27.使用闭包而不是字符串来封装代码

# 28.不要信任函数对象的 toString 方法

# 29.避免使用非标准的栈检查属性

# 第4章. 对象和原型

对象是JavaScript中的基本数据结构。直观的看,对象表示字符串与值映射的一个表格。但当你深入挖掘时,你会发行对象中有相当多的体系。

与许多面向对象的语言一样,JavaScript支持继承,即通过动态代理机制重用代码或数据。但和其他许多传统的语言不同的是,JavaScript的继承机制基于原型,而不是类。对于许多程序员来说,JavaScript是第一个不需要类而实现面向对象的语言。

在许多语言中,每个对象是相关类的实例,该类提供在其所有实例间共享属性和方法。相反,JavaScript并没有类的内置概念,对象是从其它对象中继承而来。每个对象与其它一些对象是相关的,这些对象称为它的原型。尽管依然使用了很多传统的面向对象语言的概念,但使用原型与使用类有很大差异。

# 30.理解 prototype、getPrototypeOf 和proto之间的不同

# 31.使用 Object.getPrototypeOf 函数而不要使用proto属性

# 32.始终不要修改proto属性

# 33.使用构造函数与 new 方法无关

# 34.在原型中存储方法

# 35.使用闭包存储私有数据

# 36.只将实力状态存储在实例对象中

# 37.认识到 this 变量的隐式绑定问题

# 38.在子类的构造函数中调用父类的构造函数

# 39.不要重用父类的属性名

# 40.避免继承标准类

# 41.将原型视为实现细节

# 42.避免使用轻率的猴子补丁

# 第5章. 数组和字典

对象是JavaScript中最万能的数据结构。取决于不同的环境,对象可以表示一个灵活的键值关联记录,一个继承了方法的面向对象数据抽象,一个密集或稀疏的数组,或一个散列表。当然,使用这一多用途的工具需要掌握针对不同需求的不同惯用法。在上一章中,我们学习了结构对象和继承的用法。在本章中,我们来解决将对象作为集合(比如不同树木元素的聚合数据结构)的方法。

# 43.使用 Object 的直接实例构造轻量级的字典

# 44.使用 null 原型以防止原型污染

# 45.使用 hasOwnProperty 方法

# 46.使用数组而不要使用字典来存储有序集合

# 47.绝不要在 Object.prototype 中增加可枚举的属性

# 48.避免在枚举期间修改对象

# 49.数组迭代要优先使用 for 循环而不是 for..in 循环

# 50.迭代方法优于循环

# 51.在类数组对象上服用通用的数组方法

# 52.数组字面量优于数组构造函数

# 第6章. 库和 API 设计

从某种意义上讲,每个程序员都是API设计者。也许你并未计划立即写下一个流行的JavaScript库,但当你的程序已经在一个平台上运行足够长的时间,你对常见问题建立了完善的解决方案,迟早你会开始开发可重用的程序和组件。即使你没有将其发布为单独的库,提升自己的技能成为一个库作者能让你编写更好的组件。

设计程序是一个棘手的业务,更多的表现为科学艺术,这是非常重要的。API是程序员的基本词汇。设计良好的API能让你的用户(这可能包括你自己)清楚、简洁和明确地表达自己的程序。

# 53.保持一致的约定

# 54.将 undefined 看作"没有值"

# 55.接收关键字参数的选项对象

# 56.避免不必要的状态

# 57.使用结构类型设计灵活的接口

# 58.区分数组对象和类数组对象

# 59.避免过度的强制转换

# 60.支持方法链

# 第7章. 并发

JavaScript被设计为一种嵌入式的脚本语言。JavaScript程序不是以单独的应用程序运行,而是作为大型应用程序下的脚本运行。典型的例子当然是Web浏览器。一个浏览器可能具有许多窗体和标签运行多个Web应用程序,每个应用程序相应不同的输入和触发源--用户通过键盘、鼠标、触摸板的动作,来自网络的数据传输,或定时告警。这些事件可能在Web应用程序的生命周期的任何时刻发生,甚至同时发生。针对每种事件,应用程序可能希望得到消息通知,并相应自定义行为。

在JavaScript中,编写响应多个并发事件的程序的方法非常人性化,而且强大,因为它使用了一个简单的执行模型(有时称为事件队列或事件循环并发)和被称为异步的API。多亏了这一方法的有效性以及JavaScript独立于Web浏览器标准化的事实,使得JavaScript成为其它多种应用程序的编程语言,比如从桌面端应用程序到服务端框架的Node.js。

奇怪的是,到目前为止,ECMAScript标准从来没有关于并发的任何说明。因此,本章将讨论一些“约定俗成”的JavaScript特性,而不是官方的标准。然而,绝大多数JavaScript的环境都使用相同的并发策略,未来标准的版本很有可能会基于广泛实现的执行模型来标准化。不管标准如何定义,使用事件和异步API是JavaScript编程的基础部分。

# 61.不要阻塞 I/O 事件队列

# 62.在异步序列中使用嵌套或命名的回调函数

# 63.当心丢弃错误

# 64.对异步循环使用递归

# 65.不要在计算时阻塞事件队列

# 66.使用计数器来执行并行操作

# 67.绝不要同步地调用异步的回调函数

# 68.使用 promise 模式清洁异步逻辑

最近更新时间: 11/4/2020, 8:59:28 PM