编辑推荐
《深入理解JavaScript》针对JavaScript初学者,帮助读者掌握JavaScript开发的精髓。每一章从教授语言的一个主题开始,给出了实践以及解决实际缺陷的指南,然后深入到相关的信息。《深入理解JavaScript》帮助入门的程序员理解基础知识,掌握核心实践,甚至深入了解一些实践方法的优缺点,做到知其然且知其所以然。
《JavaScript启示录》一书作者CodyLindley鼎力推荐
喜欢,又或是不喜欢,JavaScript都在那里,日夜相随,不离不弃。JavaScript正越来越多地出现在我们的生活中,从浏览器到服务端,再到移动端。想要学习这种语言,或者深入了解一些你没有涉足的内容,《深入理解JavaScript》正是你的选择,它既可以指引入门也能够带你深入JavaScript。作者是一位程序员,也曾在相同的处境中暮然回首,找到了真实的自己。
《深入理解JavaScript》通过4个独立部分引领读者逐步接近JavaScript语言。首先,快速指引部分帮助你在JavaScript编程上变得富有成效。更有经验的程序员会返现有一个完整而易读的参考,深入覆盖了该语言的每个特性。
《深入理解JavaScript》包括以下内容:
JavaScript快速上手:更习惯面向对象的编程?这个部分会帮你更快更好地开始学习JavaScript。
背景:了解JavaScript的历史,以及它与其他语言之间的关系。
深入JavaScript:详细学习ECMAScript5,从语法,变量,函数,面向对象编程,再到正则表达式和JSON,以及大量的示例。
技巧、工具和类库:对现有风格指引、实践、高阶技术、模块系统、包管理、构建工具进行调研和学习。内容简介
JavaScript是目前Web开发领域非常流行的一种编程语言,得到众多IT从业人员和编程爱好者的关注。
《深入理解JavaScript》是一本全面、深入介绍JavaScript语言的学习指南。《深入理解JavaScript》共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局变量、编码和JavaScript、ECMAScript5的新特性等内容;第4部分介绍技巧、工具和类库,帮助读者更好地运用JavaScript进行编程。
《深入理解JavaScript》内容由浅入深,非常适合想要快速学习JavaScript编程或者深入钻研JavaScript的读者参考。作者简介
AxelRauschmayer专攻JavaScript和Web开发领域。他在2ality.com写博客,教Ecmanauten,编辑JavaScriptWeekly周刊,组织MunichJS用户组。Axel从1985年开始编程,1995年开始开发web应用。目录
第1部分 JavaScript快速上手
第1章 基础JavaScript3
1.1背景3
1.1.1JavaScript与ECMAScript3
1.1.2JavaScript的影响和本质3
1.2语法4
1.2.1语法概述4
1.2.2语句和表达式5
1.2.3分号5
1.2.4注释6
1.3变量和赋值6
1.3.1赋值6
1.3.2复合赋值运算符6
1.3.3标识符与变量名6
1.4值7
1.4.1原始值和对象8
1.4.2原始值9
1.4.3对象9
1.4.4undefined和null10
1.4.5使用typeof和instanceof对值分类11
1.5布尔值13
1.5.1真值与假值13
1.5.2二元逻辑运算符14
1.5.3等式运算符14
1.6数字14
1.7运算符15
1.8字符串16
1.8.1字符串运算符16
1.8.2字符串方法17
1.9语句17
1.9.1条件语句17
1.9.2循环语句18
1.10函数19
1.10.1函数声明的提升特性19
1.10.2特殊的变量arguments20
1.10.3参数太多或太少20
1.10.4可选参数20
1.10.5强制参数长度21
1.10.6将arguments转换为数组21
1.11异常捕获21
1.12严格模式22
1.13变量作用域和闭包22
1.13.1变量是函数作用域的23
1.13.2变量的提升特性23
1.13.3闭包23
1.13.4IIFE模式:引入一个新的作用域24
1.14对象和构造函数25
1.14.1单一对象25
1.14.2任意属性名26
1.14.3提取方法26
1.14.4方法中的函数27
1.14.5构造函数:对象工厂28
1.15数组29
1.15.1数组字面量29
1.15.2数组方法30
1.15.3遍历数组30
1.16正则表达式31
1.16.1test()方法:匹配吗31
1.16.2exec()方法:匹配以及捕获分组31
1.16.3replace()方法:搜索和替换31
1.17Math32
1.18标准库的其他功能32
第2部分 背景
第2章 为什么选择JavaScript35
2.1JavaScript可以自由使用吗35
2.2JavaScript优雅吗36
2.3JavaScript有用吗36
2.3.1图形用户界面36
2.3.2其他技术补充完善JavaScript36
2.4JavaScript有什么好用的工具吗37
2.5JavaScript是否足够快37
2.6JavaScript是广泛使用的吗38
2.7JavaScript有前途吗38
2.8结论38
第3章 JavaScript的性质39
3.1古怪和非官方特性40
3.2优雅部分40
3.3影响41
第4章 JavaScript是如何创造出来的42
第5章 标准化:ECMAScript44
第6章 JavaScript的历史里程碑46
第3部分 深入JavaScript
第7章 JavaScript的语法53
7.1语法概览53
7.2注释54
7.3表达式与语句54
7.3.1表达式55
7.3.2语句55
7.4控制流语句和块57
7.5使用分号的规则57
7.5.1 以块结束的语句后面没有分号58
7.5.2空语句58
7.5.3自动分号插入59
7.6合法标识符60
7.7数字字面量的方法调用62
7.8严格模式62
7.8.1启用严格模式62
7.8.2严格模式:建议与注意事项63
7.8.3严格模式中,变量必须被声明63
7.8.4严格模式下的函数63
7.8.5严格模式中,设置或者删除不可改变的属性会抛出异常65
7.8.6严格模式中的不合格标识符不能删除65
7.8.7严格模式中,eval更加简洁66
7.8.8严格模式中禁用的特性66
第8章 值67
8.1JavaScript中的类型体系67
8.1.1JavaScript类型67
8.1.2静态与动态68
8.1.3静态类型与动态类型68
8.1.4静态类型检查和动态类型检查68
8.1.5强制转换69
8.2 原始值和对象69
8.2.1 原始值70
8.2.2对象70
8.3undefined和null72
8.3.1undefined和null的出现场景72
8.3.2检测undefined和null73
8.3.3undefined和null的历史74
8.3.4修改undefined75
8.4原始值的包装对象76
8.4.1包装对象不同于原始值76
8.4.2原始值的包装与去包装76
8.4.3原始值从包装器借调方法77
8.5强制类型转换78
8.5.1强制类型转换会隐藏bug78
8.5.2转换成布尔值、数字、字符串和对象的函数78
8.5.3算法:ToPrimitive()—将值转换为原始值80
第9章 运算符82
9.1运算符和对象82
9.2赋值运算符82
9.3等号运算符:===和==84
9.3.1严格相等(===,!==)84
9.3.2普通(宽松)相等(==,!=)85
9.3.3没有针对==的有效用例87
9.4排序运算符88
9.5加号运算符(+)89
9.6布尔运算符和数字运算符90
9.7 特殊运算符90
9.7.1 条件运算符(?:)90
9.7.2逗号运算符91
9.7.3void运算符91
9.8通过typeof和instanceof判断值类型93
9.8.1 typeof:判断原始值93
9.8.2instanceof:检测对象是否是给定构造函数的实例95
9.9对象运算符96
第10章 布尔类型97
10.1转换成布尔值97
10.1.1手动转换为布尔值97
10.1.2真值和假值98
10.2逻辑运算符99
10.2.1二元逻辑运算符:与(&&)和或(||)99
10.2.2逻辑与(&&)100
10.2.3逻辑或(||)100
10.2.4逻辑非(!)101
10.3等号运算符、排序运算符101
10.4Boolean函数102
第11章 数字103
11.1数字字面量103
11.1.1说明103
11.1.2在字面量上调用方法104
11.2转换成数字104
11.2.1手动转换为数字104
11.2.2parseFloat()105
11.3特殊的数字值106
11.3.1NaN106
11.3.2Infinity108
11.3.3两个0109
11.4数字的内部表示111
11.5处理舍入错误112
11.6JavaScript中的整型114
11.6.1整型的范围114
11.6.2将整型表示为浮点数字115
11.6.3安全的整型116
11.7转换成整数117
11.7.1通过Math.floor(),Math.ceil()和Math.round()得到整数118
11.7.2通过定制函数ToInteger()得到整数119
11.7.3通过位运算符得到32位整数119
11.7.4通过parseInt()得到整数121
11.8算术运算符122
11.9位运算符125
11.9.1背景知识125
11.9.2位运算非操作符126
11.9.3二进制位运算符126
11.9.4位运算移位操作符127
11.10Number函数128
11.11Number构造器属性128
11.12Number原型方法129
11.12.1Number.prototype.toFixed(fractionDigits?)129
11.12.2Number.prototype.toPrecision(precision?)130
11.12.3Number.prototype.toString(radix?)130
11.12.4Number.prototype.toExponential(fractionDigits?)131
11.13用于数字的函数132
11.14本章参考资料132
第12章 字符串133
12.1字符串字面量133
12.2字符串字面量中的转义字符134
12.3字符访问135
12.4转换为字符串135
12.5字符串比较137
12.6字符串拼接137
12.6.1合并:加号(+)运算符137
12.6.2合并:拼接字符串数组138
12.7字符串函数138
12.8字符串构造器方法138
12.9字符串length属性139
12.10字符串原型方法139
12.10.1提取子字符串139
12.10.2字符串的变换141
12.10.3字符串的检索和比较142
12.10.4支持正则表达式的方法143
第13章 语句145
13.1声明和变量赋值145
13.2循环语句和条件语句的主体145
13.3循环146
13.3.1循环的机制146
13.3.2while147
13.3.3do-while147
13.3.4for147
13.3.5for-in148
13.3.6foreach-in150
13.4条件语句150
13.4.1if-then-else150
13.4.2switch151
13.5with语句153
13.5.1语法与语义153
13.5.2with语句已被废弃154
13.5.3废弃with的原因154
13.6debugger语句156
第14章 异常捕获157
14.1什么是异常捕获157
14.2JavaScript中的异常捕获158
14.2.1throw159
14.2.2try-catch-finally159
14.2.3例子160
14.3Error构造器161
14.4栈跟踪162
14.5实现一个自己的异常构造器163
第15章 函数164
15.1JavaScript中函数的3种形式164
15.2术语:“形参”和“实参”165
15.3定义函数165
15.3.1函数表达式166
15.3.2函数声明167
15.3.3Function构造器167
15.4函数提升167
15.5函数的名称168
15.6哪个更好,函数声明还是函数表达式168
15.7控制函数调用:call(),apply()和bind()169
15.7.1func.apply(thisValue,argArray)169
15.7.2func.bind(thisValue,arg1,...,argN)170
15.8参数缺失或者超出时的处理170
15.8.1通过索引访问所有参数:神奇的arguments变量170
15.8.2强制性参数,限制参数数量的最小值172
15.8.3可选参数173
15.8.4模拟参数的引用传递173
15.8.5陷阱:非预期的可选参数174
15.9具名参数175
15.9.1具名参数可作为描述信息175
15.9.2可选的具名参数176
15.9.3在JavaScript中模拟具名参数176
第16章 变量:作用域、环境和闭包177
16.1定义变量177
16.2背景知识:静态性和动态性177
16.3背景知识:变量的作用域178
16.4变量以函数为作用域179
16.5变量声明的提前180
16.6通过IIFE引入新的作用域181
16.6.1IIFE变体:前缀运算符182
16.6.2IIFE变体:预内置表达式上下文183
16.6.3IIFE变体:传参的IIFE183
16.6.4IIFE的应用183
16.7全局变量184
16.7.1最佳实践:避免创建全局变量184
16.7.2模块系统可以减少全局变量的引入185
16.8全局对象185
16.8.1跨平台兼容186
16.8.2window的使用场景186
16.9环境:变量的管理188
16.10闭包:使得函数可以维持其创建时所在的作用域191
16.10.1通过环境来控制闭包191
16.10.2陷阱:不经意间的环境共用193
第17章 对象与继承195
17.1第1层:单一对象195
17.1.1属性的种类195
17.1.2对象字面量196
17.1.3点运算符(.):通过固定键值访问属性197
17.1.4特殊的属性键199
17.1.5中括号操作符([]):通过计算出的键访问属性199
17.2把任意值转化为对象201
17.3this作为函数和方法的隐式参数202
17.3.1在调用函数时设置this:call(),apply()和bind()202
17.3.2“用于构造函数的apply()”详细阐述了如何配合构造函数
使用apply()203
17.3.3用于构造函数的apply()204
17.3.4缺陷:提取方法时丢失this206
17.3.5缺陷:方法中的函数会掩盖this207
17.4第2层:对象间的原型关系209
17.4.1继承209
17.4.2覆写210
17.4.3通过原型在对象间共享数据210
17.4.4获取和设置原型211
17.4.5特殊属性__proto__213
17.4.6设置和删除仅影响自有属性214
17.5遍历和检测属性215
17.5.1列出自有的属性键215
17.5.2列出所有的属性键216
17.5.3检测属性是否存在216
17.5.4示例217
17.6最佳实践:遍历自有属性218
17.7访问器(getter和setter)218
17.7.1通过对象字面量定义访问器219
17.7.2通过属性描述符定义访问器219
17.7.3访问器和继承219
17.8属性特性和属性描述符220
17.8.1属性特性220
17.8.2属性描述符221
17.8.3通过描述符获取和定义属性221
17.8.4复制对象223
17.8.5属性:定义与赋值224
17.8.6继承的只读属性不能被赋值225
17.8.7枚举性:最佳实践225
17.9保护对象226
17.9.1防止扩展226
17.9.2封闭227
17.9.3冻结228
17.9.4缺陷:保护是浅层的229
17.10第3层:构造函数—实例工厂229
17.10.1JavaScript中new操作符的实现231
17.10.2术语:两个原型231
17.10.3实例的constructor属性232
17.10.4instanceof运算符234
17.10.5实现构造函数的小技巧237
17.11原型属性中的数据238
17.11.1对于实例属性,避免使用带初始值的原型属性238
17.11.2避免非多态的原型属性240
17.11.3多态的原型属性241
17.12保持数据私有性241
17.12.1构造函数环境中的私有数据(Crockford私有模式)241
17.12.2使用标记的键的属性保存私有数据245
17.12.3使用具体化键的属性保存私有数据246
17.12.4通过IIFE保持全局数据私有247
17.13第4层:构造函数之间的继承248
17.13.1继承实例属性249
17.13.2继承原型属性249
17.13.3确保instanceof正常工作250
17.13.4覆写方法251
17.13.5父调用251
17.13.6避免硬编码父构造函数的名字252
17.13.7示例:构造函数继承253
17.13.8示例:内建构造函数的继承层次结构254
17.13.9反模式:原型是父构造函数的实例254
17.14所有对象的方法254
17.14.1转换为原始值254
17.14.2Object.prototype.toLocaleString()255
17.14.3原型式继承和属性255
17.15泛型方法:借用原型方法256
17.15.1通过字面量访问Object.prototype和Array.prototype257
17.15.2调用泛型方法的例子258
17.15.3类似数组的对象和泛型方法259
17.15.4所有泛型方法列表261
17.16缺陷:Object作为Map使用263
17.16.1缺陷1:继承影响读取属性263
17.16.2缺陷2:覆写会影响调用方法265
17.16.3缺陷3:特殊属性__proto__265
17.16.4字典模式:没有原型的对象更适合用作映射266
17.16.5最佳实践267
17.17备忘录:对象的使用267
第18章 数组269
18.1概述269
18.1.1数组是映射,不是元组270
18.1.2数组也可以具有属性270
18.2创建数组270
18.2.1数组构造函数271
18.2.2多维数组271
18.3数组索引272
18.3.1操作符in与索引273
18.3.2删除数组元素273
18.3.3数组索引的细节273
18.4长度275
18.4.1手动增加数组的长度275
18.4.2减少数组的长度276
18.4.3最大长度277
18.5数组中的“空缺”277
18.5.1创建空缺278
18.5.2稀疏数组和密集数组278
18.5.3哪些操作会忽略空缺,而哪些不会279
18.5.4移除数组中的空缺280
18.6数组构造函数281
18.7数组原型方法281
18.8添加和删除元素(破坏性地)281
18.9排序和颠倒元素顺序(破坏性地)283
18.9.1比较数字284
18.9.2比较字符串284
18.9.3比较对象284
18.10合并、切分和连接(非破坏性地)285
18.11值的查找(非破坏性地)286
18.12迭代(非破坏性地)287
18.12.1检测方法287
18.12.2转化方法289
18.12.3归约函数289
18.13缺陷:类数组对象291
18.14最佳实践:遍历数组291
第19章 正则表达式293
19.1正则表达式语法293
19.1.1原子:常规293
19.1.2原子:字符类295
19.1.3原子:分组296
19.1.4量词296
19.1.5断言297
19.1.6析取(或)298
19.2Unicode和正则表达式298
19.3创建正则表达式298
19.3.1字面量与构造函数299
19.3.2标识299
19.3.3正则表达式的实例属性299
19.3.4几个创建正则表达式的例子300
19.4RegExp.prototype.test:是否存在匹配300
19.5String.prototype.search:匹配位置的索引301
19.6RegExp.prototype.exec:捕获分组301
19.6.1首次匹配(不设置标识/g)302
19.6.2全部匹配(设置标识/g)302
19.7String.prototype.match:捕获分组或返回所有匹配的子字符串303
19.8String.prototype.replace:查找和替换303
19.8.1Replacement为字符串的情况304
19.8.2当Replacement为函数时305
19.9标识/g的一些问题305
19.10提示与技巧308
19.10.1引用文本308
19.10.2陷阱:缺少断言(例如^、$)的正则表达式可以在任意位置
匹配308
19.10.3匹配一切或什么都不匹配308
19.10.4手动实现逆向查找309
19.11正则表达式备忘单310
第20章 Date313
20.1Date构造函数313
20.2Date构造函数方法315
20.3Date原型方法315
20.3.1时间单位的getter和setter方法316
20.3.2各种各样的getter和setter方法317
20.3.3将日期转换成字符串317
20.4日期和时间格式319
20.4.1日期格式(无时间)319
20.4.2时间格式(无日期)320
20.4.3日期时间格式321
20.5时间值:从1970-01-01开始的毫秒数321
第21章 Math323
21.1Math属性323
21.2数值函数324
21.3三角函数325
21.4其他函数327
第22章 JSON329
22.1背景329
22.1.1数据格式329
22.1.2历史330
22.1.3语法330
22.2JSON.stringify(value,replacer?,space?)334
22.2.1被JSON.stringify()忽略的数据335
22.2.2toJSON()方法336
22.3JSON.parse(text,reviver?)337
22.4通过节点访问函数转换数据338
22.4.1JSON.stringify()339
22.4.2JSON.parse()339
第23章 标准全局变量341
23.1构造器341
23.2Error构造器342
23.3非构造器函数342
23.3.1文字的编码和解码342
23.3.2数值归类与数值转换343
23.4通过eval()和newFunction()来动态执行JavaScript代码344
23.4.1使用eval()执行代码344
23.4.2通过newFunction()执行代码346
23.4.3eval()与newFunction()比较347
23.4.4最佳实践347
23.4.5结论347
23.5ConsoleAPI348
23.5.1ConsoleAPI在各引擎的标准程度如何348
23.5.2简单的日志记录349
23.5.3检查和计数350
23.5.4格式化的日志350
23.5.5性能和时间352
23.6名称空间和特殊值353
第24章 编码和JavaScript354
24.1Unicode历史354
24.2Unicode中的重要概念354
24.3码位356
24.4Unicode编码357
24.5JavaScript源码和Unicode359
24.5.1内部源码转化359
24.5.2源码外部转化359
24.6JavaScript字符串和Unicode361
24.6.1转义序列361
24.6.2通过转义引用星际平面的字符361
24.6.3字符长度计算362
24.6.4Unicode正常化362
24.7JavaScript正则表达式和Unicode363
24.7.1匹配任意的码元以及任意的码位364
24.7.2库364
24.7.3推荐阅读的章节资源364
第25章 ECMAScript5的新特性366
25.1新特性366
25.2语法的改变367
25.3标准库的新功能367
25.3.1元编程367
25.3.2新方法368
25.3.3JSON369
25.4兼容旧浏览器的小贴士370
第4部分 技巧、工具和类库
第26章 元编程风格指南373
26.1现有风格指南373
26.2通用技巧374
26.2.1代码应该具有一致性374
26.2.2代码应该易于理解374
26.3普遍认可的最佳实践375
26.3.1括号风格376
26.3.2推荐字面量而不是构造函数377
26.3.3不要自作聪明378
26.3.4可接受的技巧379
26.4具有争议的规则380
26.4.1语法380
26.4.2变量381
26.4.3面向对象382
26.4.4其他383
26.5结论384
第27章 调试的语言机制385
第28章 子类化内置构造函数386
28.1术语386
28.2障碍1:具有内部属性的实例386
28.2.1障碍1的解决方法388
28.2.2 注意389
28.3障碍2:内置的构造函数不能作为方法调用389
28.4另一种解决方案:委托390
第29章 JSDoc:生成API文档392
29.1JSDoc基础393
29.1.1语法393
29.1.2 命名类型394
29.2基础的标签395
29.3文档记录函数和方法396
29.4行内类型信息(“行内文档注释”)397
29.5文档记录变量、参数和实例属性397
29.6文档记录类398
29.6.1通过构造函数定义类399
29.6.2通过对象字面量定义类399
29.6.3通过带有@constructs方法的对象字面量定义类400
29.6.4子类400
29.7其他有用的标签401
第30章 类库402
30.1shim和polyfill402
30.2四个语言类库403
30.3ECMAScript的国际化API403
30.3.1ECMAScript的国际化API,第1版403
30.3.2它是怎么样的标准呢404
30.3.3我们可以用它做什么404
30.3.4延伸阅读404
30.4JavaScript资源目录405
第31章 模块系统和包管理器407
31.1模块系统407
31.2包管理器408
31.3简单粗暴的模块实现408
第32章 其他工具410
第33章 接下来该做什么412