JavaScript 高级程序设计

yuanyxh大约 13 分钟

简介

《JavaScript 高级程序设计》 是业界公认的 JavaScript 红宝书,书中简单介绍了 JavaScript 的历史,并由此展开,全面详实的介绍了 JavaScript 的相关知识。

《JavaScript 高级程序设计》 目前已更至第 4 版,于 2019 年出版发售,前三版的作者是 Nicholas C. Zakasopen in new window [1],因病不能参与第 4 版的编写,第 4 版作者是 Matt Frisbie[2]

这本书适合刚入门的前端人员阅读,也适合很多虽然工作很久但从未深入了解过这门语言的前端开发者。

推荐原因

《JavaScript 高级程序设计》 是我刚入门前端时读的第一本前端书籍,因本人入门前端较晚,所以看的是第 4 版,在那个时侯,我只是简单的对 HTMLCSSJavaScript 这三个网页组成部分有所了解,而这本书让我较为全面深入的了解了 JavaScript 这门语言。

不同于工具书籍,这本书并不仅仅是介绍 JavaScript 一些 Api 的作用,而是从历史出发,带我们了解这些 Api 的出现原因、作用以及解决了什么问题,比如 let/constclassPromise 等等,让我收获颇丰,不愧 红宝书 之名。

文章会对 《JavaScript 高级程序设计》 的全部章节进行简要总结,对于部分内容可能会另写单独的文章进行较为深入的讲解,这些文章会同步更新附录在对应章节下,对于其他书籍类的文章都会采用这种模式。

章节

第 1 章 什么是 JavaScript

通过本章知道了 JavaScript 的由来与发展,JavaScript 是 Brendan Eich 于 1995 年开发的一门脚本语言,一开始主要用于表单校验。

由于浏览器厂商相互竞争,出现了多个版本的 JavaScript,它们的实现不尽相同,为了统一 JavaScript 的语法与特性,规范被制定出来,被称为 ECMAScript。

JavaScript 并不完全等于 ECMAScript,JavaScript 包含三个部分

  • ECMAScript
  • BOM
  • DOM

ECMAScript

ECMAScript 只规定了不特定于平台的部分,像 documentlocation 这些 Api 就是特定于 Web 平台的,不特定于平台意味着只要引擎实现满足 ECMAScript 规范定义,那么只包含这部分的代码能够运行在任何平台下。

ECMAScript 版本之前以发布次数作为版本号,最近几年由于前端蓬勃发展,ECMAScript 每年都会发布一个新版本,所以目前以年份作为版本号,当然,普遍会将 ES2015 以后的版本统称为 ES6 或 ES6+。

BOM

BOM,浏览器对象模型,顾名思义,这部分特定于浏览器,提供的 Api 主要用于操作浏览器窗口。

DOM

DOM,文档对象模型,提供了操作网页文档的 Api,通过 DOM 能够实现页面的动态改变而无需请求一份新的网页文件。

DOM Level 1 映射文档结构,DOM Level 2 增加视图、事件、样式、遍历与范围等模块,DOM Level 3 新增加载、保存、验证文档的方法,且支持所有 XML 1.0 特性,DOM 4 新增 Mutation Events 与 Mutation Observers;目前不以 Level 维护 DOM。

第 2 章 HTML 中的 JavaScript

通过本章了解了任何在 HTML 使用 JavaScript,并在浏览器不支持 JavaScript 时显示后置内容。

script

<script> 元素可以用于加载外部 JavaScript 脚本,也能在元素内部直接书写 JavaScript 代码,他有许多属性,通过这些属性我们能够实现延迟执行、异步加载等功能。

通过 DOM Api 我们能够动态加载脚本,在 <script> 被添加到 DOM 前并执行前,对应的脚本不会被下载。

noscript

<noscript> 元素在不支持 JavaScript 或相关功能被关闭的浏览器上会显示,用于告知用户相应的内容。

第 3 章 语言基础

本章讲述了语言相关的基础知识,如语法、变量、数据类型、操作符、语句、函数等。

语法

JavaScript 的语法很大程度上借鉴了 C 语言,它区分大小写,标识符、注释都采用 C 风格,同时还描述了一组关键字与保留字。

变量

ES6 以前使用 var 声明变量,现在已不再推荐使用,因为它具有很多不符合直觉的行为。

相关文章

数据类型

JavaScript 有许多内置的数据类型,如 number、string、boolean、symbol、undefined、null 等基本数据类型,还有 object 引用数据类型。

相关文章

操作符

JavaScript 中拥有许多可用的操作符,如一元操作符、位操作符、布尔操作符、乘性操作符、加性操作符、关系操作符、相等操作符、条件操作符、复制操作符、逗号操作符等。

语句

JavaScript 与其他语言一样,拥有多种语句,如 if、do-while、while、for、for-in、for-of、标签语句、break 与 continue、with、switch 等常用语句。

函数

JavaScript 是 C 风格的语言,使用函数作为核心组件,使用函数封装语句以达到复用,JavaScript 函数是一等公民。

第 4 章 变量、作用域与内存

本章讲述了 JavaScript 中非常重要的概念:变量、作用域以及内存的相关知识。

JavaScript 变量

JavaScript 中的变量是弱类型的,变量的类型只在运行时确定,这意味着我们能够动态改变变量的类型(静态类型的语言不允许我们这样做),但这通常是不建议的。

JavaScript 变量分为原始值与引用值,原始值就是最简单的数据,引用值就是多个值构成的对象。

作用域

作用域与执行上下文在编程语言中是一个重要的概念,变量与函数的上下文决定了它们能够访问哪些数据,作用域一般分为全局作用域、函数作用域、块作用域。

内存

合理的管理内存是浏览器厂商需要考虑的,对于不再需要使用的内存,一般有两种垃圾回收方式:标记清理与引用计数。标记清理标记不再需要使用的数据,在合适的时间进行垃圾回收;引用计数记录每个数据被引用的次数,没有引用时进行垃圾回收(引用计数可能出现循环引用的情况,如 a 对象有一个属性引用了 b 对象,b 对象有一个属性引用了 a 对象,这会导致它们的引用次数永远为 1)。

我们无法控制垃圾回收运行的运行,但我们能够编写合理的代码以减少垃圾回收的次数,这对性能是有提升的。

第 5 章 基本引用类型

本章介绍了一些常见的内置引用类型,如 Date、RegExp 类型,它们提供了大量的实用 Api 供开发者使用,同时还介绍了原始值类型对应的包装类型,由此得知原始值为何能够使用引用类型特有的属性与方法。

除了内置类型,还存在着一些内置的对象实例,它们不与宿主环境相关,在 ECMAScript 程序运行时就存在,如 Global(并不显示存在,但浏览器将其实现为 window 对象)、Math。

第 6 章 集合引用类型

本章介绍了 JavaScript 中的集合引用类型,集合即一系列数据的组合,如 Object、Array、定型数组、Map、WeakMap、Set、WeakSet、DOM 节点,其中重点介绍了数组的相关操作,以及定型数组的由来与作用,还有 Map 映射与 Set 集合,对于 Map,它允许将任意类型当作 key,而 Object 是不允许的。

同时还详细介绍了对于这些集合引用类型的迭代以及扩展操作。

第 7 章 迭代器与生成器

本章介绍了 ES6 非常重要的特性,迭代器与生产器,通过本章我们了解了什么是迭代器模式,以及迭代器协议与可迭代对象的概念,同时还了解了生产器是一种强大的流程控制模式,生成器对象也满足了迭代器协议。

相关文章

第 8 章 对象、类与面向对象编程

本章详细讲述了 JavaScript 中的对象是什么,它实现继承的本质以及 JavaScript 中的类。同时讲述了一下关于对象的操作,如迭代对象。

相关文章

第 9 章 代理与反射

本章讲述了 ES6 的新特性,代理与反射。讲述了它们的基本使用与 Api捕获器不变式,还了解了它们的不足之处,以及代理与反射可能的应用场景,比如:跟踪数据访问、隐藏属性、属性验证、数据绑定等。

第 10 章 函数

本章介绍了 JavaScript 中的函数,包括函数参数、函数引用、函数重载、默认参数等,还介绍了 ES6 中的箭头函数。同时了解了关于函数的一些操作与细节,如:递归、尾调用优化、闭包、私有变量、模块模式等。

相关文章

第 11 章 期约与异步函数

本章介绍了异步编程,以往的异步编程模式和如今异步编程模式的差异;其中 PromiseES6 中的一个强大特性,支持我们以更好的方式处理异步任务,而异步函数基于 Promise 构建了一个更符合直觉的异步执行流程;使用它们能够给我们带来极大的便利,还可以避免出现回调地狱这样的代码。

相关文章

第 12 章 BOM

本章讲述了 BOM,即浏览器对象模型,详细介绍了 windowlocationnavigatorscreenhistory 等与浏览器环境相关的 Api,并简单描述了与浏览器相关的部分操作。

第 13 章 客户端检测

本章介绍了几种检测客户端环境的方式,比如能力检测、用户代理检测、软件与硬件检测等。

需要拥有检测客户端能力的原因是因为浏览器历史原因,不同浏览器的部分 Api 不兼容,需要检测出对应的浏览器进行不同适配。

第 14 章 DOM

本章介绍了 DOM,即文档对象模型,介绍了关于文档的基础知识,还介绍了不同节点的类型、属性操作等。同时讲解了部分的 DOM 操作,讲述了监听 DOM 元素变化的 ApiMutationObserver

第 15 章 DOM 扩展

这一章接上一章继续讲解 DOM 相关知识,如选择器 Api、元素变量、HTML5 以及部分专有扩展,讲述了更多关于 DOM 文档操作的知识。

第 16 章 DOM2 和 DOM3

本章介绍了 DOM 的历史与演进,包含 DOM样式、、遍历范围 等不同 Api 的变化。

第 17 章 事件

本章介绍了事件相关的知识,包含事件模型、事件处理、事件对象、事件类型等。讲述了不同浏览器对象事件之间的差异,如何通过事件委托减少内存消耗,还讲述了如何模拟合成事件。

第 18 章 Canvas 图形

本章介绍了 canvas 相关知识,一开始介绍了如何通过 requestAnimationFrame 函数实现平滑动画,随后介绍了 canvas 的绘图上下文,以及如何通过绘图上下文提供的 Api 绘制一些基本图形,还讲述了 3D 相关的内容。

第 19 章 表单脚本

本章讲解了网站开发中非常重要的一个组成部分:表单。包括表单基础、文本框编程、选中框编程、表单序列化、富文本编辑等操作,以及常见的表单验证。

第 20 章 JavaScript API

注意

这一部分的内容是非常重要的,其中很多内容在如今都有重要的运用场景。

本章讲述了非常多的 JavaScript API,包含 Atomics & SharedArrayBuffer跨上下文消息Encoding APIFile API & Blob API原生托放Notifications APIPage Visibility APIStreams API计时 APIHigh Resolution Time APIPerformance Timeline APIWeb 组件Web Cryptography API

第 21 章 错误处理与调试

本章讲解了如何在宿主环境中调试代码,以及一些关于错误处理的最佳实践。

第 22 章 处理 XML

本章介绍了关于 XML 文档的相关知识,以及一些对 XML 文档的操作。

第 23 章 JSON

本章介绍了 JSON 的基本语法,以及 JSON 解析与序列化相关的知识。

第 24 章 网络请求与远程资源

本章介绍了如何在浏览器环境使用 XMLHttpRequest 发送网络请求获取资源,同时讲解了有关跨域资源共享的知识,还有浏览器提供的 fetchweb socket 这两种网络通信方式。

第 25 章 客户端存储

本章讲解了在客户端存储数据的几种方式,如:cookieweb storageindexedDB

第 26 章 模块

本章讲解了模块,包括模块的形成原因、模块的发展、模块的导入导出、异步导入等知识。

第 27 章 工作者线程

本章介绍了工作者线程以及几种工作者线程的类型与区别,同时讲解了这些线程的生命周期、通信、线程管理等知识,同时给出了几种可能的应用场景。

第 28 章 最佳实践

本章讲解了关于工作、代码的最近实践,包括编写可维护的代码、性能考量、部署等知识。


  1. Nicholas C. Zakas:独立软件开发者,曾在 Yahoo 和 Box 任职,创建了 ESLint 开源项目,同时也是 《JavaScript 高级程序设计》 1~3 版的作者 ↩︎

  2. Matt Frisbie:知名前端技术专家,曾在 Google 任职,目前担任 Gosellout 公司 CTO ↩︎

Loading...