JavaScript高级程序设计(第4版) (Matt Frisbie) (Z-Library)
Author: Matt Frisbie
JavaScript
No Description
📄 File Format:
PDF
💾 File Size:
13.7 MB
29
Views
0
Downloads
0.00
Total Donations
📄 Text Preview (First 20 pages)
ℹ️
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
📄 Page
1
(This page has no text content)
📄 Page
2
(This page has no text content)
📄 Page
3
图灵社区的电子书没有采用专有客 户端,您可以在任意设备上,用自 己喜欢的浏览器和PDF阅读器进行 阅读。 但您购买的电子书仅供您个人使用, 未经授权,不得进行传播。 我们愿意相信读者具有这样的良知 和觉悟,与我们共同保护知识产权。 如果购买者有侵权行为,我们可能 对该用户实施包括但不限于关闭该 帐号等维权措施,并可能追究法律 责任。
📄 Page
4
(This page has no text content)
📄 Page
5
内 容 提 要 本书是 JavaScript 经典图书的新版。第 4 版涵盖 ECMAScript 2019,全面、深入地介绍了 JavaScript 开 发者必须掌握的前端开发技术,涉及 JavaScript 的基础特性和高级特性。书中详尽讨论了 JavaScript 的各个 方面,从 JavaScript 的起源开始,逐步讲解到新出现的技术,其中重点介绍 ECMAScript 和 DOM 标准。在 此基础上,接下来的各章揭示了 JavaScript 的基本概念,包括类、期约、迭代器、代理,等等。另外,书 中深入探讨了客户端检测、事件、动画、表单、错误处理及 JSON。本书同时也介绍了近几年来涌现的重 要新规范,包括 Fetch API、模块、工作者线程、服务线程以及大量新 API。 本书适合有一定编程经验的 Web 应用程序开发人员阅读,也可作为高校及社会实用技术培训相关专 业课程的教材。 定价:129.00元 读者服务热线:(010)51095183转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东市监广登字 20170147 号 著 [美] 马特 • 弗里斯比 译 李松峰 责任编辑 温 雪 责任印制 周昇亮 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 https://www.ptpress.com.cn 北京 印刷 开本:800×1000 1/16 印张:55.5 字数:1710千字 2020年 9 月第 2 版 印数:276 001 — 281 000册 2020年 10 月北京第 2 次印刷 著作权合同登记号 图字:01-2019-7913号 ◆ ◆ ◆ (2020.10重印) ISBN: 9781119366447 Professional JavaScript for Web Developers, 4th Edition, by Matt Frisbie. © 2020 by John Wiley & Sons, Inc., Indianapolis, Indiana. 本书简体中文版由 John Wiley & Sons, Inc. 授权人民邮电出版社独家出版。 本书封底贴有 John Wiley & Sons, Inc. 激光防伪标签,无标签者不得销售。 版权所有,侵权必究。
📄 Page
6
错误!文档中没有指定样式的文字。 1 1 2 3 4 5 13 6 7 8 9 10 11 12 献给 Jordan,感谢她无论听到多少次“快写完了”都仍然坚定地支持我。
📄 Page
7
2 前 言 图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
📄 Page
8
译者序 v 1 2 3 4 5 13 6 7 8 9 10 11 12 译者序 七年弹指一挥间。2012 年到 2019 年是 JavaScript 蓬勃发展的七年,鼎鼎大名的 Stack Overflow 调查 显示,截至 2019 年,JavaScript 已连续七年位居“最常用编程语言”(most commonly used programming language)榜首。事实上,2020 年的调查结果也毫无悬念,JavaScript 依旧独占鳌头。 2012 年是这本被誉为 JavaScript“红宝书”的著作第 3 版出版的时间。生逢其时,第 3 版狂销几十 万册,影响深远,甚至改变了很多人的命运(包括本书译者)。随着 ECMAScript 2015(ES6)的发布, JavaScript 这门语言再次被注入新的生机与活力。2019 年 10 月,涵盖 ECMAScript 2019 的第 4 版面世。 如今,跨过一个年头,中文版也要付梓了。 “红宝书”的这一版延续了上一版的框架和格局,删减了已经过时的内容,在此基础上又翔实地增 补了 ES2015 到 ES2019 的全新内容,英文版篇幅也达到了前所未有的 1100 多页。 翻译期间,译者虽然尽最大努力确保译文准确、通顺,但错漏之处在所难免。为此特别感谢本书责 任编辑温雪,感谢她对译稿认真细致的编辑和审校,以及对出版流程的卓越把控,确保了中文版的早日 上市。 在本书印行前夕,为进一步确保出版质量、减少图书错误,我们邀请了数位一线前端开发工程师共 同对本书进行了预读和勘误。在短短两周时间内,大家分工协作,筛查、发现并“消灭”了不少文字、 排版、代码和技术上的问题,大大提升了本书首印质量。他们分别是(按审读章节顺序排序)饶占平、 梁幸芝、陈方旭、林景宜、王欢、刘冰晶、邢洋洋、刘博文、刘观宇、王佳裕。特此致谢。特别感谢贺 师俊(Hax)对“期约”(promise)及相关一系列术语翻译的建议。 最后,衷心祝愿罹患“莱姆病”(Lyme disease)的 Nicholas Zakas 早日康复。 2020 年 7 月 15 日 图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
📄 Page
9
vi 序 序 工业革命是钢铁铸就的,互联网革命则是 JavaScript 造就的。25 年的反复锻造与打磨,成就了 JavaScript 在今天的应用程序开发中毋庸置疑的统治地位,但并非一开始就是如此。 Brendan Eich 只用 10 天就写出了 JavaScript 的第一版。初生的 JavaScript 看似弱不禁风,但历史表 明,第一印象并不代表一切。今天,这门语言的每个细节,也就是这本书所涉及的方方面面,都是反复 推敲的产物。并非所有决定都让人满意,也没有完美的编程语言,不过单从无所不在这方面看,JavaScript 倒是很接近完美。它是目前唯一一个可以随处部署的语言:服务器、桌面浏览器、手机浏览器,甚至原 生移动应用程序中都有它的身影。 JavaScript 目前的使用者有不同层次的软件工程师,他们的背景各异。无论是以开发设计精良、优 雅的软件为目标,还是仅仅为了完成业绩而简单堆砌一个系统,JavaScript 都能派上用场。 怎么使用 JavaScript 完全取决于你。一切尽在你的掌握之中。 在我超过 15 年的软件开发生涯中,JavaScript 工具和最佳实践已经发生了天翻地覆的变化。2004 年, 我开始接触这门语言,当时还是雅虎地球村(Geocities)、雅虎群组(Yahoo Groups)和 Macromedia Flash 播放器的天下。JavaScript 给人感觉像个玩具,当时我在 RSS、MySpace Profile Pages 等流行的沙盒环境 中开始使用它。后来我又帮助一些个人网站修改和自定义功能,那种感觉就像在狂野的西部拓荒,而我 也因此喜欢上了它。 当初我创建第一家公司的时候,配置主机装个数据库要花几天时间,而 JavaScript 只要扔到 HTML 里就可以跑起来。“前端应用程序”是不存在的,主要是零七碎八的函数。后来 Ajax 因为 jQuery 火了而 变得更加流行,这才打开了通向新世界的大门,可靠、稳定的应用程序应运而生。这股风潮愈演愈烈, 直到有一天遇到了发展瓶颈,但突然间,强大的框架诞生了。前端模型、数据绑定、路由管理、反应式 视图,全都爆发出来了。我就在这个时候搬到硅谷,帮人打理一家公司。很快,使用我代码的用户达到 了几百万。置身硅谷这么长时间以来,我也为开源做了一些贡献,培训了不计其数的软件工程师,也走 了一点儿运。我的上一家公司在 2018 年被 Stripe 收购,我现在就供职于这家公司,致力于为互联网构 建其经济基础设施。 我很高兴在马特第一次到帕洛阿尔托的一家小型创业公司领导工程化时结识了他。那家公司叫 Claco,当时我刚成为它的顾问。他追求伟大软件的活力和激情溢于言表,而这家羽翼未丰的公司很快 就开发出一款漂亮的产品。一如为硅谷公司设立标杆的惠普,这家创业公司也诞生在一间平房里。但这 图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
📄 Page
10
序 vii 1 2 3 4 5 13 6 7 8 9 10 11 12 可不是寻常的民房,而是一间“黑客屋”,里面十几位才华横溢的软件工程师经常通宵达旦地工作。虽 然过的不是什么高档次生活——他们坐的都是别人扔在大街上的那种沙发床和旧椅子——他们在这间 房子里每天所写代码的数量和质量却引人瞩目。连续工作几小时后,大多数人会把精力投入到公司的另 一个子项目上,然后又是几个小时的工作。不太会写代码的人也常受启发,发现自己学习的渴望,然后 仅仅几个星期后就变成了代码能手。 马特是促成这种开发效率的关键角色。他是“黑客屋”里经验最丰富的人,恰好也是思维最清晰、 最专业的一个。拿到计算机工程学位并不能说明什么,只要在窗户或者白板上看到马特写的算法、性能 计算以及代码,你就知道马特又在专注于他的下一个大项目。随着我对他了解的加深,我们成为了好朋 友。他的领悟能力,他对培训工作的热爱,以及几乎可以把所有东西转化成笑话的能力,都是我所欣赏 的品质。 虽然马特是一位极具才华的软件工程师和项目领导,但他之所以能成为本书作者独一无二的人选, 还是凭借他独有的经验和知识。 他不仅仅花时间教别人,而且还把这本书写完了。 在Claco,他开发了多款整体性产品,端到端地帮助教师在课堂上提供更好的学习体验。在DoorDash, 他是第一位工程师,开发了一个可靠的物流配送系统并实现了高速增长,目前公司估值超过了 120 亿美 元。最后,在 Google,马特写的软件已经被这个星球上的数十亿人使用了。 全情投入,快速增长,誉满天下——多数软件工程师终其一生也只能体验到其中一项,而且还得运 气好。马特不仅体验到了全部,还成为了畅销书作者。除了本书,他还写了两本 JavaScript 和 Angular 的书。说实话,我就想知道他什么时候能写一本书,把自己管理时间的奥秘分享出来。 本书是一部翔实的工具书,满满的都是 JavaScript 知识和实用技术。我热切希望本书读者能够不断 学习,并亲手打造属于自己的梦想。欢迎大家多多挑错,多记笔记,别忘了打开代码编辑器,毕竟互联 网革命才刚刚开始! Zach Tratar Stripe 软件工程师 Jobstart 联合创始人、前 CEO
📄 Page
11
viii 前 言 前 言 关于 JavaScript,谷歌公司的一位技术经理曾经跟我分享过一个无法反驳的观点。他说 JavaScript 并不是一门真正有内聚力的编程语言,至少形式上不是。ECMA-262 规范定义了 JavaScript,但 JavaScript 没有唯一正确的实现。更重要的是,这门语言与其宿主关系密切。实际上宿主为 JavaScript 定义了与外 界交互所需的全部 API:DOM、网络请求、系统硬件、存储、事件、文件、加密,还有数以百计的其他 API。各种浏览器及其 JavaScript 引擎都按照自己的理解实现了这些规范。Chrome 有 Blink/V8,Firefox 有 Gecko/SpiderMonkey,Safari 有 WebKit/JavaScriptCore,微软有 Trident/EdgeHTML/Chakra。浏览器以 合规的方式运行绝大多数 JavaScript,但 Web 上随处可见迎合各种浏览器偏好的页面。因此,对 JavaScript 更准确的定位应该是一组浏览器实现。 Web 纯化论者可能认为 JavaScript 本身并非网页不可或缺的部分,但他们必须承认,如果没有 JavaScript,那么现代 Web 势必发生严重倒退。毫不夸张地讲,JavaScript 才是真正不可或缺的。如今, 手机、计算机、平板设备、电视、游戏机、智能手表、冰箱,甚至连汽车都内置了可以执行 JavaScript 代码的 Web 浏览器。地球上有近 30 亿人在使用安装了 Web 浏览器的智能手机。这门语言迅速发展的社 区催生了大量高质量的开源项目。浏览器也已经支持模拟原生移动应用程序的 API。Stack Overflow 2019 年的开发者调查显示,JavaScript 连续七年位于最流行编程语言榜首。 我们正迎来 JavaScript 的文艺复兴。 本书将从 JavaScript 的起源讲起,从最初的 Netscape 浏览器直到今天各家浏览器支持的让人眼花缭 乱的技术。全书对大量高级技术进行了鞭辟入里的剖析,以确保读者真正理解这些技术并掌握它们的应 用场景。简而言之,通过学习本书,读者可以透彻地理解如何选择恰当的 JavaScript 技术,以解决现实 开发中遇到的业务问题。 读者对象 本书适合以下读者阅读。 有经验的开发者,熟悉面向对象编程,因为 JavaScript 与 Java 和 C++等传统面向对象(OO,Object Oriented)语言的关系而希望学习 JavaScript。 Web 应用程序开发者,希望增强自己的网站或 Web 应用程序的易用性。
📄 Page
12
前 言 ix 1 2 3 4 5 13 6 7 8 9 10 11 12 初级 JavaScript 开发者,希望更好地理解这门语言。 此外,熟悉以下相关技术对阅读本书非常有帮助。 Java PHP Python Ruby Golang HTML CSS 本书内容 本书第 4 版全面深入地介绍了 JavaScript 开发者必须掌握的前端开发技术,涉及 JavaScript 的基础特 性和高级特性。 本书从 JavaScript 的起源开始,逐步讲解到今天的最新技术。书中详尽讨论了 JavaScript 的各个方面, 重点介绍 ECMAScript 和 DOM 标准。 在此基础上,接下来的各章揭示了 JavaScript 的基本概念,包括类、期约、迭代器、代理,等等。 另外,书中还深入探讨了客户端检测、事件、动画、表单、错误处理及 JSON。 本书最后介绍近几年来涌现的最新和最重要的规范,包括 Fetch API、模块、工作者线程、服务线 程以及大量新 API。 组织结构 本书包含如下这些章。多个章节配有免费视频课二维码,扫描即可观看。 第 1 章,介绍 JavaScript 的起源:从哪里来,如何发展,以及现今的状况。这一章会谈到 JavaScript 与 ECMAScript 的关系、DOM、BOM,以及 Ecma 和 W3C 相关的标准。 第 2 章,了解 JavaScript 如何与 HTML 结合来创建动态网页,主要介绍在网页中嵌入 JavaScript 的 不同方式,还有 JavaScript 的内容类型及其与<script>元素的关系。 第 3 章,介绍语言的基本概念,包括语法和流控制语句;解释 JavaScript 与其他类 C 语言在语法上 的异同点。在讨论内置操作符时也会谈到强制类型转换。此外还将介绍所有的原始类型,包括 Symbol。 第 4 章,探索 JavaScript 松散类型下的变量处理。这一章将涉及原始类型与引用类型的不同,以及 与变量有关的执行上下文。此外,这一章也会讨论 JavaScript 中的垃圾回收,涉及在变量超出作用域时 如何回收内存。 第 5 章,讨论 JavaScript 所有内置的引用类型,如 Date、Regexp、原始类型及其包装类型。每种
📄 Page
13
x 前 言 引用类型既有理论上的讲解,也有相关浏览器实现的剖析。 第 6 章,继续讨论内置引用类型,包括 Object、Array、Map、WeakMap、Set 和 WeakSet 等。 第 7 章,介绍 ECMAScript 新版中引入的两个基本概念:迭代器和生成器,并分别讨论它们最基本 的行为和在当前语言环境下的应用。 第 8 章,解释如何在 JavaScript 中使用类和面向对象编程。首先会深入讨论 JavaScript 的 Object 类 型,进而探讨原型式继承,接下来全面介绍 ES6 类及其与原型式继承的紧密关系。 第 9 章,介绍两个紧密相关的概念:Proxy(代理)和 Reflect(反射) API。代理和反射用于拦 截和修改这门语言的基本操作。 第 10 章,探索 JavaScript 最强大的一个特性:函数表达式,主要涉及闭包、this 对象、模块模式、 创建私有对象成员、箭头函数、默认参数和扩展操作符。 第 11 章,介绍两个紧密相关的异步编程构造:Promise 类型和 async/await。这一章讨论 JavaScript 的异步编程范式,进而介绍期约(promise)与异步函数的关系。 第 12 章,介绍 BOM,即浏览器对象模型,跟与浏览器本身交互的 API 相关。所有 BOM 对象都会 涉及,包括 window、document、location、navigator 和 screen 等。 第 13 章,解释检测客户端机器及其能力的不同手段,包括能力检测和用户代理字符串检测。这一 章讨论每种手段的优缺点,以及适用的场景。 第 14 章,介绍 DOM,即文档对象模型,主要是 DOM Level 1 定义的 API。这一章将简单讨论 XML 及其与 DOM 的关系,进而全面探索 DOM 以及如何利用它操作网页。 第 15 章,解释其他 DOM API,包括浏览器本身对 DOM 的扩展,主要涉及 Selectors API、Element Traversal API 和 HTML5 扩展。 第 16 章,在之前两章的基础上,解释 DOM Level 2 和 Level 3 对 DOM 的扩展,包括新增的属性、 方法和对象。这一章还会介绍 DOM4 的相关内容,比如 Mutation Observer。 第 17 章,解释事件在 JavaScript 中的本质,以及事件的起源及其在 DOM 中的运行方式。 第 18 章,围绕<canvas>标签讨论如何创建动态图形,包括 2D 和 3D 上下文(WebGL)等动画和 游戏开发所需的基础。这一章还会讨论 WebGL1 和 WebGL2。 第 19 章,探索使用 JavaScript 增强表单交互及突破浏览器限制,主要讨论文本框、选择框等表单元 素及数据验证和操作。 第 20 章,介绍各种 JavaScript API,包括 Atomics、Encoding、File、Blob、Notifications、Streams、 Timing、Web Components 和 Web Cryptography。 第 21 章,讨论浏览器如何处理 JavaScript 代码中的错误及几种错误处理方式。这一章同时介绍了每 种浏览器的调试工具和技术,包括简化调试过程的建议。
📄 Page
14
前 言 xi 1 2 3 4 5 13 6 7 8 9 10 11 12 第 22 章,介绍通过 JavaScript 读取和操作 XML 数据的特性,解释了不同浏览器支持特性和对象的 差异,提供了简化跨浏览器编码的建议。这一章也讨论了使用 XSLT 在客户端转换 XML 数据。 第 23 章,介绍作为 XML 替代的 JSON 数据格式,还讨论了浏览器原生解析和序列化 JSON,以及 使用 JSON 时要注意的安全问题。 第 24 章,探讨浏览器请求数据和资源的常用方式,包括早期的 XMLHttpRequest和现代的 Fetch API。 第 25 章,讨论应用程序离线时在客户端机器上存储数据的各种技术。先从 cookie 谈起,然后讨论 Web Storage 和 IndexedDB。 第 26 章,介绍模块模式在编码中的应用,进而讨论 ES6 模块之前的模块加载方式,包括 CommonJS、 AMD 和 UMD。最后介绍新的 ES6 模块及其正确用法。 第 27 章,深入介绍专用工作者线程、共享工作者线程和服务工作者线程。其中包括工作者线程在 操作系统和浏览器层面的实现,以及使用各种工作者线程的最佳策略。 第 28 章,探讨在企业级开发中进行 JavaScript 编码的最佳实践。其中提到了提升代码可维护性的编 码惯例,包括编码技巧、格式化及通用编码建议。深入讨论应用性能和提升速度的技术。最后介绍与上 线部署相关的话题,包括项目构建流程。 预备条件 要运行本书示例代码,需要如下条件。 现代操作系统,包括 Windows、Linux、Mac OS、Android 或 iOS。 现代浏览器,如 IE11+、Edge 12+、Firefox 26+、Chrome 39+、Safari 10+、Opera 26+或 iOS Safari 10+。 扫描封底二维码,可以下载本书源代码,并加入图灵前端研发小组。① 电子书及附录 扫描下方二维码,即可购买本书中文版电子书,并从“随书下载”处获取本书电子版附录。 —————————— ① 读者也可访问本书图灵社区页面(https://www.ituring.com.cn/book/2472)下载本书配套学习资源,并提交中文版勘误。 ——编者注 图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
📄 Page
15
xii 致 谢 致 谢 感谢 Wiley 出版社让我接手这本书。编写本书第 4 版对我来说是前所未有的挑战,也让我收获非常 大。来自 Wiley 的包容和支持是本书得以完成的前提。感谢 Wiley 的工作人员,特别是把这本书交到我 手上并紧盯着整个流程的 Jim Minatel。 感谢本书前 3 版的作者 Nicholas C. Zakas,感谢他在我接手之前所做的一切。没有他之前打下的良 好基础,就不会有本书今天的成就。衷心祝愿他早日康复。 特别感谢 Adaobi Obi Tulton 的指导。如果没有她对整个流程的把控,以及她的耐心和专业水准,我 不可能写完这一版。 还要感谢对本书草稿给出反馈意见的所有人:Samuel Kallner、Chaim Krause、Marcia Wilbur、Nancy Rapoport、Athiyappan Lalith Kumar,还有 Evelyn Wellborn。这样一本书,少了你们任何人的帮助,都不 会像现在这么完善。 最后,我想感谢 Zach Tratar 为本书作序。我非常幸运地在搬到旧金山的头一天就认识了 Zach Tratar。 几年来,作为良师益友,他的求知若渴和博学多才一直感染着我,何况他还是一位杰出的软件工程师。 他同意为本书作序是我的荣幸。 图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
📄 Page
16
目 录 xiii 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 17 目 录 第 1 章 什么是 JavaScript ............................ 1 1.1 简短的历史回顾 ....................................... 1 1.2 JavaScript 实现 ......................................... 2 1.2.1 ECMAScript .................................. 2 1.2.2 DOM ............................................. 6 1.2.3 BOM .............................................. 8 1.3 JavaScript 版本 ......................................... 9 1.4 小结 ......................................................... 10 第 2 章 HTML 中的 JavaScript ................... 11 2.1 <script>元素 ......................................... 11 2.1.1 标签位置 ...................................... 13 2.1.2 推迟执行脚本 .............................. 14 2.1.3 异步执行脚本 .............................. 14 2.1.4 动态加载脚本 .............................. 15 2.1.5 XHTML 中的变化 ........................ 16 2.1.6 废弃的语法 .................................. 17 2.2 行内代码与外部文件 ............................... 18 2.3 文档模式 .................................................. 18 2.4 <noscript>元素 .................................... 19 2.5 小结 ......................................................... 20 第 3 章 语言基础 ............................................ 21 3.1 语法 ......................................................... 21 3.1.1 区分大小写 .................................. 21 3.1.2 标识符 .......................................... 21 3.1.3 注释 .............................................. 22 3.1.4 严格模式 ...................................... 22 3.1.5 语句 .............................................. 22 3.2 关键字与保留字 ...................................... 23 3.3 变量 ......................................................... 24 3.3.1 var 关键字 .................................. 24 3.3.2 let 声明 ...................................... 25 3.3.3 const 声明 .................................. 28 3.3.4 声明风格及最佳实践 ................... 29 3.4 数据类型 .................................................. 30 3.4.1 typeof 操作符 ............................ 30 3.4.2 Undefined 类型 ......................... 30 3.4.3 Null 类型 .................................... 32 3.4.4 Boolean 类型 .............................. 33 3.4.5 Number 类型 ................................ 33 3.4.6 String 类型 ................................ 38 3.4.7 Symbol 类型 ................................ 44 3.4.8 Object 类型 ................................ 56 3.5 操作符 ..................................................... 56 3.5.1 一元操作符 .................................. 56 3.5.2 位操作符 ...................................... 59 3.5.3 布尔操作符 .................................. 64 3.5.4 乘性操作符 .................................. 66 3.5.5 指数操作符 .................................. 67 3.5.6 加性操作符 .................................. 68 3.5.7 关系操作符 .................................. 69 3.5.8 相等操作符 .................................. 70 3.5.9 条件操作符 .................................. 72 3.5.10 赋值操作符 ................................ 72 3.5.11 逗号操作符 ................................ 73 3.6 语句 ......................................................... 73 3.6.1 if 语句 ........................................ 73 3.6.2 do-while 语句 ............................ 74 3.6.3 while 语句 .................................. 74
📄 Page
17
xiv 目 录 3.6.4 for 语句 ...................................... 74 3.6.5 for-in 语句 ................................ 75 3.6.6 for-of 语句 ................................ 76 3.6.7 标签语句 ...................................... 76 3.6.8 break 和 continue 语句 ........... 76 3.6.9 with 语句 .................................... 78 3.6.10 switch 语句 .............................. 78 3.7 函数 ......................................................... 80 3.8 小结 ......................................................... 82 第 4 章 变量、作用域与内存....................... 83 4.1 原始值与引用值 ...................................... 83 4.1.1 动态属性 ...................................... 83 4.1.2 复制值 .......................................... 84 4.1.3 传递参数 ...................................... 85 4.1.4 确定类型 ...................................... 86 4.2 执行上下文与作用域 .............................. 87 4.2.1 作用域链增强 .............................. 89 4.2.2 变量声明 ...................................... 90 4.3 垃圾回收 ................................................. 94 4.3.1 标记清理 ...................................... 95 4.3.2 引用计数 ...................................... 95 4.3.3 性能 ............................................. 96 4.3.4 内存管理 ...................................... 97 4.4 小结 ....................................................... 101 第 5 章 基本引用类型 ................................. 103 5.1 Date ...................................................... 103 5.1.1 继承的方法 ................................ 105 5.1.2 日期格式化方法 ........................ 106 5.1.3 日期/时间组件方法 ................... 106 5.2 RegExp .................................................. 107 5.2.1 RegExp 实例属性 ...................... 109 5.2.2 RegExp 实例方法 ...................... 109 5.2.3 RegExp 构造函数属性 .............. 111 5.2.4 模式局限 .................................... 113 5.3 原始值包装类型 .................................... 113 5.3.1 Boolean .................................... 114 5.3.2 Number ...................................... 115 5.3.3 String ...................................... 117 5.4 单例内置对象 ........................................ 128 5.4.1 Global ...................................... 128 5.4.2 Math .......................................... 132 5.5 小结 ....................................................... 135 第 6 章 集合引用类型 ................................. 136 6.1 Object .................................................. 136 6.2 Array .................................................... 138 6.2.1 创建数组 .................................... 138 6.2.2 数组空位 .................................... 140 6.2.3 数组索引 .................................... 141 6.2.4 检测数组 .................................... 142 6.2.5 迭代器方法 ................................ 143 6.2.6 复制和填充方法 ........................ 143 6.2.7 转换方法 .................................... 145 6.2.8 栈方法 ....................................... 147 6.2.9 队列方法 .................................... 147 6.2.10 排序方法 .................................. 148 6.2.11 操作方法 .................................. 150 6.2.12 搜索和位置方法 ...................... 151 6.2.13 迭代方法 .................................. 153 6.2.14 归并方法 .................................. 154 6.3 定型数组 ............................................... 155 6.3.1 历史 ........................................... 155 6.3.2 ArrayBuffer ............................ 155 6.3.3 DataView .................................. 156 6.3.4 定型数组 .................................... 159 6.4 Map ........................................................ 163 6.4.1 基本 API .................................... 164 6.4.2 顺序与迭代 ................................ 166 6.4.3 选择 Object 还是 Map .............. 168 6.5 WeakMap ................................................ 168 6.5.1 基本 API .................................... 168 6.5.2 弱键 ........................................... 170 6.5.3 不可迭代键 ................................ 170 6.5.4 使用弱映射 ................................ 171
📄 Page
18
目 录 xv 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 17 6.6 Set ......................................................... 173 6.6.1 基本 API ..................................... 173 6.6.2 顺序与迭代 ................................ 175 6.6.3 定义正式集合操作 ..................... 176 6.7 WeakSet ................................................ 178 6.7.1 基本 API ..................................... 178 6.7.2 弱值 ............................................ 179 6.7.3 不可迭代值 ................................ 180 6.7.4 使用弱集合 ................................ 180 6.8 迭代与扩展操作 .................................... 180 6.9 小结 ....................................................... 182 第 7 章 迭代器与生成器 ............................. 183 7.1 理解迭代 ................................................ 183 7.2 迭代器模式 ............................................ 184 7.2.1 可迭代协议 ................................ 184 7.2.2 迭代器协议 ................................ 186 7.2.3 自定义迭代器 ............................ 188 7.2.4 提前终止迭代器 ......................... 190 7.3 生成器 .................................................... 192 7.3.1 生成器基础 ................................ 192 7.3.2 通过 yield 中断执行 ................ 194 7.3.3 生成器作为默认迭代器 ............. 201 7.3.4 提前终止生成器 ......................... 202 7.4 小结 ....................................................... 204 第 8 章 对象、类与面向对象编程 ............ 205 8.1 理解对象 ................................................ 205 8.1.1 属性的类型 ................................ 206 8.1.2 定义多个属性 ............................ 208 8.1.3 读取属性的特性 ......................... 209 8.1.4 合并对象 .................................... 210 8.1.5 对象标识及相等判定 ................. 213 8.1.6 增强的对象语法 ......................... 213 8.1.7 对象解构 .................................... 216 8.2 创建对象 ................................................ 220 8.2.1 概述 ............................................ 220 8.2.2 工厂模式 .................................... 220 8.2.3 构造函数模式 ............................ 221 8.2.4 原型模式 .................................... 224 8.2.5 对象迭代 .................................... 233 8.3 继承 ....................................................... 238 8.3.1 原型链 ........................................ 238 8.3.2 盗用构造函数 ............................ 243 8.3.3 组合继承 .................................... 244 8.3.4 原型式继承 ................................ 245 8.3.5 寄生式继承 ................................ 246 8.3.6 寄生式组合继承 ........................ 247 8.4 类 ........................................................... 249 8.4.1 类定义 ........................................ 249 8.4.2 类构造函数 ................................ 250 8.4.3 实例、原型和类成员 ................. 254 8.4.4 继承............................................ 258 8.5 小结 ....................................................... 265 第 9 章 代理与反射 ..................................... 266 9.1 代理基础 ................................................ 266 9.1.1 创建空代理 ................................ 266 9.1.2 定义捕获器 ................................ 267 9.1.3 捕获器参数和反射 API ............. 268 9.1.4 捕获器不变式 ............................ 270 9.1.5 可撤销代理 ................................ 271 9.1.6 实用反射 API ............................. 271 9.1.7 代理另一个代理 ........................ 273 9.1.8 代理的问题与不足 ..................... 273 9.2 代理捕获器与反射方法 ......................... 274 9.2.1 get() ......................................... 275 9.2.2 set() ......................................... 275 9.2.3 has() ......................................... 276 9.2.4 defineProperty() ................. 277 9.2.5 getOwnProperty- Descriptor() .......................... 277 9.2.6 deleteProperty() ................. 278 9.2.7 ownKeys() ................................ 279 9.2.8 getPrototypeOf() ................. 279 9.2.9 setPrototypeOf() ................. 280
📄 Page
19
xvi 目 录 9.2.10 isExtensible() .................... 280 9.2.11 preventExtensions() ......... 281 9.2.12 apply() .................................. 281 9.2.13 construct() .......................... 282 9.3 代理模式 ............................................... 283 9.3.1 跟踪属性访问 ............................ 283 9.3.2 隐藏属性 .................................... 283 9.3.3 属性验证 .................................... 284 9.3.4 函数与构造函数参数验证 ......... 284 9.3.5 数据绑定与可观察对象 ............. 285 9.4 小结 ....................................................... 286 第 10 章 函数 ................................................ 287 10.1 箭头函数 .............................................. 288 10.2 函数名 ................................................. 289 10.3 理解参数 .............................................. 290 10.4 没有重载 .............................................. 292 10.5 默认参数值 .......................................... 293 10.6 参数扩展与收集 .................................. 295 10.6.1 扩展参数 ................................ 295 10.6.2 收集参数 ................................ 296 10.7 函数声明与函数表达式 ....................... 297 10.8 函数作为值 .......................................... 297 10.9 函数内部 .............................................. 299 10.9.1 arguments ............................ 299 10.9.2 this ....................................... 300 10.9.3 caller ................................... 301 10.9.4 new.target .......................... 301 10.10 函数属性与方法 ................................ 302 10.11 函数表达式 ........................................ 304 10.12 递归 ................................................... 306 10.13 尾调用优化 ........................................ 307 10.13.1 尾调用优化的条件 ............. 307 10.13.2 尾调用优化的代码 ............. 309 10.14 闭包 ................................................... 309 10.14.1 this 对象 .......................... 312 10.14.2 内存泄漏 ............................ 314 10.15 立即调用的函数表达式 ..................... 314 10.16 私有变量 ........................................... 316 10.16.1 静态私有变量 .................... 317 10.16.2 模块模式 ............................ 318 10.16.3 模块增强模式 .................... 320 10.17 小结 ................................................... 321 第 11 章 期约与异步函数 ........................... 322 11.1 异步编程 ............................................. 322 11.1.1 同步与异步 ............................ 322 11.1.2 以往的异步编程模式 ............. 323 11.2 期约 ..................................................... 325 11.2.1 Promises/A+规范 ................... 325 11.2.2 期约基础 ................................ 325 11.2.3 期约的实例方法 .................... 329 11.2.4 期约连锁与期约合成 ............. 338 11.2.5 期约扩展 ................................ 345 11.3 异步函数 ............................................. 347 11.3.1 异步函数 ................................ 348 11.3.2 停止和恢复执行 .................... 353 11.3.3 异步函数策略 ........................ 356 11.4 小结 ..................................................... 360 第 12 章 BOM .............................................. 361 12.1 window 对象 ....................................... 361 12.1.1 Global 作用域 ...................... 361 12.1.2 窗口关系 ................................ 362 12.1.3 窗口位置与像素比 ................ 362 12.1.4 窗口大小 ................................ 363 12.1.5 视口位置 ................................ 364 12.1.6 导航与打开新窗口 ................ 365 12.1.7 定时器 .................................... 368 12.1.8 系统对话框 ............................ 370 12.2 location 对象 ................................... 372 12.2.1 查询字符串 ............................ 372 12.2.2 操作地址 ................................ 373 12.3 navigator 对象 ................................. 375 12.3.1 检测插件 ................................ 376 12.3.2 注册处理程序 ........................ 378
📄 Page
20
目 录 xvii 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 17 12.4 screen 对象 ........................................ 379 12.5 history 对象 ...................................... 379 12.5.1 导航 ........................................ 379 12.5.2 历史状态管理 ......................... 380 12.6 小结 ..................................................... 381 第 13 章 客户端检测 ................................... 382 13.1 能力检测 .............................................. 382 13.1.1 安全能力检测 ......................... 383 13.1.2 基于能力检测进行浏览器 分析 ........................................ 384 13.2 用户代理检测 ...................................... 386 13.2.1 用户代理的历史 ..................... 386 13.2.2 浏览器分析 ............................ 392 13.3 软件与硬件检测 .................................. 394 13.3.1 识别浏览器与操作系统 ......... 394 13.3.2 浏览器元数据 ......................... 395 13.3.3 硬件 ........................................ 400 13.4 小结 ..................................................... 400 第 14 章 DOM ............................................... 401 14.1 节点层级 .............................................. 401 14.1.1 Node 类型 .............................. 402 14.1.2 Document 类型 ...................... 407 14.1.3 Element 类型 ........................ 414 14.1.4 Text 类型 .............................. 420 14.1.5 Comment 类型 ........................ 423 14.1.6 CDATASection 类型 .............. 423 14.1.7 DocumentType 类型 .............. 424 14.1.8 DocumentFragment 类型 ..... 424 14.1.9 Attr 类型 .............................. 425 14.2 DOM 编程 ............................................ 426 14.2.1 动态脚本 ................................ 426 14.2.2 动态样式 ................................ 428 14.2.3 操作表格 ................................ 429 14.2.4 使用 NodeList ...................... 431 14.3 MutationObserver 接口 ................... 432 14.3.1 基本用法 ................................ 433 14.3.2 MutationObserverInit 与观察范围 ............................ 437 14.3.3 异步回调与记录队列 ............. 442 14.3.4 性能、内存与垃圾回收 ......... 443 14.4 小结 ..................................................... 444 第 15 章 DOM 扩展 ..................................... 445 15.1 Selectors API ....................................... 445 15.1.1 querySelector() ................ 445 15.1.2 querySelectorAll() ......... 446 15.1.3 matches() ............................ 447 15.2 元素遍历 .............................................. 447 15.3 HTML5 ................................................ 448 15.3.1 CSS 类扩展 ............................ 448 15.3.2 焦点管理 ................................ 450 15.3.3 HTMLDocument 扩展 ............. 450 15.3.4 字符集属性 ............................ 451 15.3.5 自定义数据属性 ..................... 451 15.3.6 插入标记 ................................ 452 15.3.7 scrollIntoView() .............. 456 15.4 专有扩展 .............................................. 456 15.4.1 children 属性 ...................... 456 15.4.2 contains()方法 ................... 457 15.4.3 插入标记 ................................ 457 15.4.4 滚动 ........................................ 459 15.5 小结 ..................................................... 459 第 16 章 DOM2 和 DOM3 ......................... 460 16.1 DOM 的演进 ........................................ 460 16.1.1 XML 命名空间 ....................... 461 16.1.2 其他变化 ................................ 464 16.2 样式 ..................................................... 467 16.2.1 存取元素样式 ........................ 467 16.2.2 操作样式表 ............................ 470 16.2.3 元素尺寸 ................................ 472 16.3 遍历 ..................................................... 476 16.3.1 NodeIterator ...................... 478 16.3.2 TreeWalker .......................... 480
The above is a preview of the first 20 pages. Register to read the complete e-book.