《深入理解JavaScript》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:(美)罗彻麦尔著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2016
  • ISBN:9787115402608
  • 页数:414 页
图书介绍:本书针对JavaScript初学者,帮助读者掌握JavaScript开发的精髓。每一章从教授语言的一个主题开始,给出了最佳实践以及解决实际缺陷的指南,然后深入到相关的信息。本书帮助入门的程序员理解基础知识,掌握核心实践,甚至深入了解一些实践方法的优缺点,做到知其然且知其所以然。

第1部分 JavaScript快速上手 3

第1章 基础JavaScript 3

1.1 背景 3

1.1.1 JavaScript与ECMAScript 3

1.1.2 JavaScript的影响和本质 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.4 undefined和null 10

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 特殊的变量arguments 20

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.4 IIFE模式:引入一个新的作用域 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.1 test()方法:匹配吗 31

1.16.2 exec()方法:匹配以及捕获分组 31

1.16.3 replace()方法:搜索和替换 31

1.17 Math 32

1.18 标准库的其他功能 32

第2部分 背景 35

第2章 为什么选择JavaScript 35

2.1 JavaScript可以自由使用吗 35

2.2 JavaScript优雅吗 36

2.3 JavaScript有用吗 36

2.3.1 图形用户界面 36

2.3.2 其他技术补充完善JavaScript 36

2.4.JavaScript有什么好用的工具吗 37

2.5.JavaScript是否足够快 37

2.6 JavaScript是广泛使用的吗 38

2.7 JavaScript有前途吗 38

2.8 结论 38

第3章 JavaScript的性质 39

3.1 古怪和非官方特性 40

3.2 优雅部分 40

3.3 影响 41

第4章 JavaScript是如何创造出来的 42

第5章 标准化:ECMAScript 44

第6章 JavaScript的历史里程碑 46

第3部分 深入JavaScript 53

第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.1 JavaScript中的类型体系 67

8.1.1 JavaScript类型 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.3 undefined和null 72

8.3.1 undefined和null的出现场景 72

8.3.2 检测undefined和null 73

8.3.3 undefined和null的历史 74

8.3.4 修改undefined 75

8.4 原始值的包装对象 76

8.4.1 包装对象不同于原始值 76

8.4.2 原始值的包装与去包装 76

8.4.3 原始值从包装器借调方法 77

8.5 强制类型转换 78

8.5.1 强制类型转换会隐藏bug 78

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.3 void运算符 91

9.8 通过typeof和instanceof判断值类型 93

9.8.1 typeof:判断原始值 93

9.8.2 instanceof:检测对象是否是给定构造函数的实例 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.4 Boolean函数 102

第11章 数字 103

11.1 数字字面量 103

11.1.1 说明 103

11.1.2 在字面量上调用方法 104

11.2 转换成数字 104

11.2.1 手动转换为数字 104

11.2.2 parseFloat() 105

11.3 特殊的数字值 106

11.3.1 NaN 106

11.3.2 Infinity 108

11.3.3 两个0 109

11.4 数字的内部表示 111

11.5 处理舍入错误 112

11.6 JavaScript中的整型 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.10 Number函数 128

11.11 Number构造器属性 128

11.12 Number原型方法 129

11.12.1 Number.prototype.toFixed(fractionDigits?) 129

11.12.2 Number.prototype.toPrecision(precision?) 130

11.12.3 Number.prototype.toString(radix?) 130

11.12.4 Number.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.2 while 147

13.3.3 do-while 147

13.3.4 for 147

13.3.5 for-in 148

13.3.6 for each-in 150

13.4 条件语句 150

13.4.1 if-then-else 150

13.4.2 switch 151

13.5 with语句 153

13.5.1 语法与语义 153

13.5.2 with语句已被废弃 154

13.5.3 废弃with的原因 154

13.6 debugger语句 156

第14章 异常捕获 157

14.1 什么是异常捕获 157

14.2 JavaScript中的异常捕获 158

14.2.1 throw 159

14.2.2 try-catch-finally 159

14.2.3 例子 160

14.3 Error构造器 161

14.4 栈跟踪 162

14.5 实现一个自己的异常构造器 163

第15章 函数 164

15.1 JavaScript中函数的3种形式 164

15.2 术语:“形参”和“实参” 165

15.3 定义函数 165

15.3.1 函数表达式 166

15.3.2 函数声明 167

15.3.3 Function构造器 167

15.4 函数提升 167

15.5 函数的名称 168

15.6 哪个更好,函数声明还是函数表达式 168

15.7 控制函数调用:call(),apply()和bind() 169

15.7.1 func.apply(thisValue,argArray) 169

15.7.2 func.bind(thisValue,argl...,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.1 IIFE变体:前缀运算符 182

16.6.2 IIFE变体:预内置表达式上下文 183

16.6.3 IIFE变体:传参的IIFE 183

16.6.4 IIFE的应用 183

16.7 全局变量 184

16.7.1 最佳实践:避免创建全局变量 184

16.7.2 模块系统可以减少全局变量的引入 185

16.8 全局对象 185

16.8.1 跨平台兼容 186

16.8.2 window的使用场景 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.3 this作为函数和方法的隐式参数 202

17.3.1 在调用函数时设置this:call(),apply()和bind() 202

17.3.2 “用于构造函数的apply()”详细阐述了如何配合构造函数使用apply() 203

17.3.3 用于构造函数的apply() 204

17.3.4 缺陷:提取方法时丢失this 206

17.3.5 缺陷:方法中的函数会掩盖this 207

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.1 JavaScript中new操作符的实现 231

17.10.2 术语:两个原型 231

17.10.3 实例的constructor属性 232

17.10.4 instanceof运算符 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.2 Object.prototype.toLocaleString() 255

17.14.3 原型式继承和属性 255

17.15 泛型方法:借用原型方法 256

17.15.1 通过字面量访问Object.prototype和Array.prototype 257

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.2 Unicode和正则表达式 298

19.3 创建正则表达式 298

19.3.1 字面量与构造函数 299

19.3.2 标识 299

19.3.3 正则表达式的实例属性 299

19.3.4 几个创建正则表达式的例子 300

19.4 RegExp.prototype.test:是否存在匹配 300

19.5 String.prototype.search:匹配位置的索引 301

19.6 RegExp.prototype.exec:捕获分组 301

19.6.1 首次匹配(不设置标识/g) 302

19.6.2 全部匹配(设置标识/g) 302

19.7 String.prototype.match:捕获分组或返回所有匹配的子字符串 303

19.8 String.prototype.replace:查找和替换 303

19.8.1 Replacement为字符串的情况 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章 Date 313

20.1 Date构造函数 313

20.2 Date构造函数方法 315

20.3 Date原型方法 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章 Math 323

21.1 Math属性 323

21.2 数值函数 324

21.3 三角函数 325

21.4 其他函数 327

第22章 JSON 329

22.1 背景 329

22.1.1 数据格式 329

22.1.2 历史 330

22.1.3 语法 330

22.2 JSON.stringify(value,replacer?,space?) 334

22.2.1 被JSON.stringify()忽略的数据 335

22.2.2 toJSON()方法 336

22.3 JSON.parse(text,reviver?) 337

22.4 通过节点访问函数转换数据 338

22.4.1 JSON.stringify() 339

22.4.2 JSON.parse() 339

第23章 标准全局变量 341

23.1 构造器 341

23.2 Error构造器 342

23.3 非构造器函数 342

23.3.1 文字的编码和解码 342

23.3.2 数值归类与数值转换 343

23.4 通过eval()和new Function()来动态执行JavaScript代码 344

23.4.1 使用eval()执行代码 344

23.4.2 通过new Function()执行代码 346

23.4.3 eval()与new Function()比较 347

23.4.4 最佳实践 347

23.4.5 结论 347

23.5 Console API 348

23.5.1 Console API在各引擎的标准程度如何 348

23.5.2 简单的日志记录 349

23.5.3 检查和计数 350

23.5.4 格式化的日志 350

23.5.5 性能和时间 352

23.6 名称空间和特殊值 353

第24章 编码和JavaScript 354

24.1 Unicode历史 354

24.2 Unicode中的重要概念 354

24.3 码位 356

24.4 Unicode编码 357

24.5 JavaScript源码和Unicode 359

24.5.1 内部源码转化 359

24.5.2 源码外部转化 359

24.6 JavaScript字符串和Unicode 361

24.6.1 转义序列 361

24.6.2 通过转义引用星际平面的字符 361

24.6.3 字符长度计算 362

24.6.4 Unicode正常化 362

24.7 JavaScript正则表达式和Unicode 363

24.7.1 匹配任意的码元以及任意的码位 364

24.7.2 库 364

24.7.3 推荐阅读的章节资源 364

第25章 ECMAScript 5的新特性 366

25.1 新特性 366

25.2 语法的改变 367

25.3 标准库的新功能 367

25.3.1 元编程 367

25.3.2 新方法 368

25.3.3 JSON 369

25.4 兼容旧浏览器的小贴士 370

第4部分 技巧、工具和类库 373

第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.1 JSDoc基础 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.1 shim和polyfill 402

30.2 四个语言类库 403

30.3 ECMAScript的国际化API 403

30.3.1 ECMAScript的国际化API,第1版 403

30.3.2 它是怎么样的标准呢 404

30.3.3 我们可以用它做什么 404

30.3.4 延伸阅读 404

30.4 JavaScript资源目录 405

第31章 模块系统和包管理器 407

31.1 模块系统 407

31.2 包管理器 408

31.3 简单粗暴的模块实现 408

第32章 其他工具 410

第33章 接下来该做什么 412