具体描述
本书旨在让读者轻松学习JavaScript的新进展,包括ES6及后续更新。书中提供了大量实用示例,以循序渐进的方式讲解了异步函数、对象解构、动态导入及异步生成器等内容。本书不仅介绍了箭头函数、解构、模板字面量以及其他语法方面的新元素,还全面展示了ES6引入的流程控制机制,以及如何高效地简化自己的代码。本书的讨论还涉及ES6内置的新集合类型、使用代理控制属性访问、ES6中内置API的改进、CommonJS与ECMAScript模块的互用性等方面。
作者简介
作者简介:
尼古拉斯•贝瓦夸(Nicolás Bevacqua)
知名JavaScript布道师,来自阿根廷的JavaScript编程高手,目前是Elastic公司用户界面工程师。另著有《JavaScript Web应用开发》一书。
译者简介:
李松峰
360前端开发资深专家、前端TC委员、W3C AC代表,奇舞团Web字体服务“奇字库”作者。
刘冰晶
毕业于北京邮电大学,现为奇舞团前端开发工程师,专注于数据可视化以及前端动画领域。
高峰
硕士,毕业于中国科学技术大学软件学院。现为奇虎360前端开发工程师。
审校简介:
黄小璐
毕业于华中科技大学计算机学院。现为奇虎360软件开发工程师。参与翻译了《高性能HTML5》《移动Web手册》《大型JavaScript应用最佳实践指南》《Web开发权威指南》等书。
欧雪雯
前端开发工程师,多年从事科技、前端技术领域业余翻译工作。
目录信息
前言 xiii
第1章 ECMAScript和JavaScript的未来 1
1.1 JavaScript标准简史 1
1.2 持续迭代的ECMAScript 3
1.3 浏览器支持和辅助工具 5
1.3.1 Babel转译器简介 5
1.3.2 使用ESLint提高代码质量和一致性 9
1.4 ES6特性 11
1.5 JavaScript的未来 12
第2章 ES6基础 14
2.1 对象字面量 14
2.1.1 属性值简写 14
2.1.2 可计算属性名 15
2.1.3 方法定义 17
2.2 箭头函数 18
2.2.1 词法作用域 19
2.2.2 箭头函数的写法 20
2.2.3 优点和用例 21
2.3 解构 22
2.3.1 对象的解构 22
2.3.2 数组的解构 25
2.3.3 函数参数的默认值 25
2.3.4 函数参数的解构 26
2.3.5 解构的用例 28
2.4 剩余参数和扩展运算符 29
2.4.1 剩余参数 29
2.4.2 扩展运算符 30
2.5 模板字面量 32
2.5.1 字符串插值 32
2.5.2 多行模板字面量 33
2.5.3 标签模板 35
2.6 let和const声明 37
2.6.1 块级作用域和let声明 38
2.6.2 暂时性死区 39
2.6.3 const声明 41
2.6.4 const和let的优势 42
第3章 类、符号、对象和装饰器 44
3.1 类 44
3.1.1 使用类 44
3.1.2 类的属性和方法 47
3.1.3 类的继承 49
3.2 符号 51
3.2.1 本地符号 51
3.2.2 符号的实际用法 53
3.2.3 全局符号注册表 55
3.2.4 众所周知的符号 57
3.3 对象的内置改进 58
3.3.1 使用Object.assign扩展对象 58
3.3.2 使用Object.is进行对象比较 61
3.3.3 Object.setPrototypeOf 62
3.4 装饰器 63
3.4.1 初识JavaScript装饰器 63
3.4.2 装饰器叠加及不变性提醒 64
3.4.3 用例:C#中的特性 64
3.4.4 在JavaScript中装饰属性 66
第4章 迭代与流程控制 68
4.1 Promise 68
4.1.1 快速理解Promise 68
4.1.2 Promise的延续与连缀 72
4.1.3 创建Promise 76
4.1.4 Promise的状态 78
4.1.5 Promise#finally提案 79
4.1.6 Promise.all和Promise.race 81
4.2 迭代器协议与可迭代协议 83
4.2.1 迭代的原理 83
4.2.2 无穷序列 85
4.2.3 迭代对象以生成键/值对 88
4.2.4 打造多功能播放列表 90
4.3 生成器函数与生成器对象 93
4.3.1 生成器基础 93
4.3.2 手工迭代生成器 96
4.3.3 将生成器混入可迭代对象 97
4.3.4 使用生成器遍历树 99
4.3.5 传递生成器函数 101
4.3.6 处理异步流 102
4.3.7 在生成器上抛出错误 103
4.3.8 代替生成器返回 104
4.3.9 基于生成器的异步I/O 105
4.4 异步函数 109
4.4.1 各种异步代码 109
4.4.2 使用async/await 111
4.4.3 并发异步流 112
4.4.4 错误处理 113
4.4.5 深入理解异步函数114
4.5 异步迭代 119
4.5.1 异步迭代器 119
4.5.2 异步生成器 120
第5章 巧妙使用ES中的集合 122
5.1 使用ES6 map 124
5.1.1 初识ES6 map 124
5.1.2 散列映射和DOM元素 128
5.2 理解和使用WeakMap 130
5.3 ES6中的Set 131
5.4 ES6 WeakSet 133
第6章 使用代理控制属性访问 136
6.1 了解代理 136
6.1.1 捕获get访问 137
6.1.2 捕获set访问 138
6.1.3 通过代理实现模式验证 140
6.2 可撤销代理 142
6.3 代理捕获器 143
6.3.1 has捕获器 143
6.3.2 deleteProperty捕获器 144
6.3.3 defineProperty捕获器 146
6.3.4 ownKeys捕获器 148
6.4 高级代理捕获器 150
6.4.1 getOwnPropertyDescriptor捕获器 150
6.4.2 apply捕获器 151
6.4.3 construct捕获器 154
6.4.4 getPrototypeOf捕获器 156
6.4.5 setPrototypeOf捕获器 157
6.4.6 preventExtensions捕获器 158
6.4.7 isExtensible捕获器 159
第7章 ES6中内置API的改进 161
7.1 数字 161
7.1.1 二进制和八进制字面量 161
7.1.2 Number.isNaN 162
7.1.3 Number.isFinite 164
7.1.4 Number.parseInt 165
7.1.5 Number.parseFloat 166
7.1.6 Number.isInteger 166
7.1.7 Number.EPSILON 167
7.1.8 Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER 167
7.1.9 Number.isSafeInteger 168
7.2 Math 170
7.2.1 Math.sign 171
7.2.2 Math.trunc 171
7.2.3 Math.cbrt 171
7.2.4 Math.expm1 172
7.2.5 Math.log1p 172
7.2.6 Math.log10 173
7.2.7 Math.log2 173
7.2.8 三角函数174
7.2.9 Math.hypot 174
7.2.10 按位计算助手 174
7.3 字符串和Unicode 175
7.3.1 String#startsWith 175
7.3.2 String#endsWith 176
7.3.3 String#includes 177
7.3.4 String#repeat 177
7.3.5 字符串填充和去空白 179
7.3.6 Unicode 180
7.3.7 String.prototype[Symbol.iterator] 181
7.3.8 有关分割字形段的提案 182
7.3.9 String#codePointAt 183
7.3.10 String.fromCodePoint 184
7.3.11 Unicode-Aware字符串反转 185
7.3.12 String#normalize 185
7.4 正则表达式 186
7.4.1 粘连修饰符/y 186
7.4.2 Unicode修饰符/u 187
7.4.3 具名捕获组 188
7.4.4 Unicode属性转义 190
7.4.5 后行断言 191
7.4.6 新的/s(dotAll)修饰符 193
7.4.7 String#matchAll 193
7.5 Array 196
7.5.1 Array.from 196
7.5.2 Array.of 198
7.5.3 Array#copyWithin 199
7.5.4 Array#fill 200
7.5.5 Array#find和Array#findIndex 201
7.5.6 Array#keys 201
7.5.7 Array#values 202
7.5.8 Array#entries 202
7.5.9 Array.prototype[Symbol.iterator] 202
第8章 JavaScript模块 204
8.1 CommonJS 204
8.2 JavaScript模块 209
8.2.1 严格模式 209
8.2.2 export语句 209
8.2.3 import语句 213
8.2.4 动态import() 215
8.3 ES模块的实践考量 216
第9章 实用建议 219
9.1 变量声明 219
9.2 模板字面量 223
9.3 简写及对象解构 227
9.4 剩余参数和扩展运算符 229
9.5 函数偏好 231
9.6 类和代理 235
9.7 异步代码流 238
9.8 复杂性蠕变、抽象及约定 241
· · · · · · (收起)
读后感
用户评价
我必须承认,这本书的阅读门槛不算低,它要求读者对基本的编程概念有一定的了解,但对于那些真心想摆脱“初级/中级”标签的开发者来说,这绝对是一笔超值的投资。《深入理解JavaScript特性》的文字风格非常干练有力,几乎没有废话,每一个段落都在传递核心信息。我个人对书中关于“函数式编程”在JavaScript中的应用实践印象深刻。作者不仅仅是介绍了高阶函数和纯函数的概念,更是通过具体的场景案例,展示了如何利用函数组合(Function Composition)和柯里化(Currying)来构建清晰、无副作用的代码块,这极大地提升了我代码的可测试性和可重用性。特别是对副作用的讨论,作者将其与纯函数的概念紧密结合,深刻阐明了在JavaScript这种多范式语言中保持函数纯净性的重要性。这本书成功地将晦涩的学术理论与实际的工程实践连接起来,提供了一套可操作的思维框架,让我能够以一种更加函数式和声明式的方式去思考和解决问题,这对于我后续的工作方法论产生了深远影响。
这本《深入理解JavaScript特性》真是让我醍醐灌顶,尤其是关于原型链和作用域链的讲解,简直是把原本模糊的概念掰开了揉碎了呈现在我面前。我记得以前看其他资料时,总是绕着这些核心概念打转,感觉理解了,但一到实际应用就卡壳。这本书的作者似乎对JavaScript的“黑盒”了如指掌,他没有停留在API层面的介绍,而是深入到了引擎是如何解析和执行代码的底层逻辑。比如,对于闭包的阐述,不仅仅是展示了如何利用闭包实现数据私有化,更是详细剖析了在不同执行上下文环境下,变量是如何被捕获和引用的,以及垃圾回收机制是如何处理这些引用的。阅读过程中,我甚至能想象出V8引擎在后台默默工作的画面。书中穿插的那些精妙的代码示例,每一次都能精准地命中我之前理解上的盲点。读完这一部分,我感觉自己对“this”关键字的掌握达到了一个新的高度,不再是死记硬背规则,而是真正理解了它在不同调用场景下的行为模式。这种从“知道怎么做”到“知道为什么这么做”的飞跃,是这本书最大的价值所在。它确实名副其实,让我对这门语言的理解“深入”到了一个前所未有的层次。
说实话,我本以为市面上关于JavaScript的书籍已经够多了,但《深入理解JavaScript特性》这本书给我带来了极大的惊喜。它的视角非常独特,完全不像那种教科书式的罗列知识点。作者的叙事风格非常具有个人魅力,读起来感觉就像是跟随一位经验丰富的老前辈在咖啡馆里进行深度交流。尤其是在处理异步编程这块,作者并没有过多渲染Promise和Async/Await的“花哨”,而是着重探讨了事件循环(Event Loop)的每一个细节,包括宏任务和微任务队列是如何协同工作的,以及它们对应用性能可能产生的微妙影响。我特别欣赏作者在讨论性能优化时所展现出的那种严谨态度,他会用实际的性能测试数据来支撑自己的论点,而不是空泛地提出建议。比如,关于对象属性的遍历顺序,书里结合了ES规范的演变来解释为什么在某些情况下我们看到的结果和预期不符,这对于构建健壮的、跨浏览器兼容性强的应用至关重要。这本书的深度和广度都令人印象深刻,它不仅仅是教你写出能运行的代码,更是教你如何写出高质量、高可维护性的代码。
这本书的结构安排非常巧妙,它没有采用传统的“初级、中级、高级”的线性结构,而是围绕JavaScript的几个核心“特性”进行深入剖析,这种专题式的讲解方式让我可以根据自己的薄弱环节进行针对性阅读。我最喜欢的是关于类型系统的那一章,JavaScript的弱类型特性一直是许多人诟病的地方,但这本书却以一种非常辩证的眼光看待它。作者详尽解释了隐式类型转换背后的规则,那些“令人困惑”的`+`操作符和`==`比较到底是如何工作的,包括`ToNumber`、`ToString`等内部抽象操作的完整流程。这种对规则的穷尽式梳理,让我彻底摆脱了靠“猜测”来写类型转换相关代码的习惯。而且,书中还巧妙地引入了TypeScript等超集语言的对比,展示了静态类型检查如何在编译期捕获这些运行时才可能暴露的问题。总的来说,这本书的阅读体验是一种渐进式的“解密”过程,它把JavaScript中那些看似随意的行为,系统地还原成了一套严谨的执行逻辑,非常适合那些追求代码鲁棒性的工程师。
我是一个前端开发中的“细节控”,总是对那些语言规范中晦涩难懂的部分耿耿于怀。市面上很多书籍对ES6、ES7新特性的介绍往往停留在“是什么”和“怎么用”,但《深入理解JavaScript特性》却花了大量篇幅去挖掘这些新特性背后的设计哲学和历史演变。例如,对于Proxy和Reflect,作者没有仅仅展示如何拦截操作,而是将其置于面向对象编程范式演变的背景下进行审视,探讨了它们如何填补了ES5时期元编程能力的不足。再比如,在讨论模块化时,作者对比了CommonJS、AMD和ES Module的差异,不仅仅是语法上的不同,更深层次地分析了它们在同步/异步加载机制、作用域绑定上的根本区别,这对于我设计大型模块化系统提供了极大的理论支撑。这本书的论述逻辑严密,引用了很多ECMAScript规范中的条款,使得所有的结论都有据可查,极大地增强了说服力。读完之后,我感觉自己对JavaScript这门语言不再是停留在“使用工具”的层面,而是上升到了“理解语言本质”的高度。
简单明了的介绍了ES6的新特性,以及使用场景。 比较适合中级小白来深入学习。
书是好书,不过翻译水平有待提高
书是好书,不过翻译水平有待提高
值得一读
简单明了的介绍了ES6的新特性,以及使用场景。 比较适合中级小白来深入学习。