精通 JavaScript
主页
购买此书
(广告,请勿屏蔽。)
目录
精通 JavaScript
赞誉
前言
关于本书你需要知道的内容
阅读本书的技巧
本书的四个部分
JavaScript 命令行
符号约定
描述语法
引用方法
命令行交互
提示、注释和警告
快速查找文档
Safari® Books Online
如何联系我们
致谢
JavaScript 准备工作
JavaScript 帮助
审阅者
第一部分 JavaScript 快速入门
第 1 章 JavaScript 基础
背景
JavaScript 与 ECMAScript
语言的影响和本质
语法
语法概述
语句与表达式
分号
注释
变量和赋值
赋值
复合赋值运算符
标识符和变量名
值
原始值与对象
原始值
对象
undefined 和 null
使用 typeof 和 instanceof 对值进行分类
布尔值
真值和假值
二元逻辑运算符
相等运算符
数字
运算符
字符串
字符串运算符
字符串方法
语句
条件语句
循环
函数
函数声明会被提升
特殊变量 arguments
参数过多或过少
可选参数
强制执行参数个数
将 arguments 转换为数组
异常处理
严格模式
变量作用域和闭包
变量是函数作用域的
变量会被提升
闭包
IIFE 模式:引入新的作用域
对象和构造函数
单个对象
任意属性键
提取方法
方法内部的函数
构造函数:对象的工厂
数组
数组字面量
数组方法
迭代数组
正则表达式
方法 test():是否存在匹配项?
方法 exec():匹配和捕获组
方法 replace():搜索和替换
Math
标准库的其他功能
第二部分 背景
第 2 章 为什么选择 JavaScript?
JavaScript 是免费可用的吗?
JavaScript 优雅吗?
JavaScript 有用吗?
图形用户界面
其他补充 JavaScript 的技术
JavaScript 有好的工具吗?
JavaScript 速度够快吗?
JavaScript 使用广泛吗?
JavaScript 有未来吗?
结论
第 3 章 JavaScript 的本质
怪癖和非传统特性
优雅的部分
影响
第 4 章 JavaScript 的诞生
第 5 章 标准化:ECMAScript
第 6 章 JavaScript 历史里程碑
第三部分 JavaScript 深入
第 7 章 JavaScript 的语法
语法概述
注释
表达式与语句
表达式
语句
控制流语句和块
使用分号的规则
以块结尾的语句后不加分号
空语句
自动分号插入
合法标识符
调用数字字面量上的方法
严格模式
切换到严格模式
严格模式:推荐使用,但需谨慎
在严格模式下必须声明变量
严格模式下的函数
在严格模式下,设置和删除不可变属性会引发异常
在严格模式下,不能删除非限定标识符
eval() 在严格模式下更简洁
严格模式下禁止使用的特性
第 8 章 值
JavaScript 的类型系统
JavaScript 的类型
静态与动态
静态类型与动态类型
静态类型检查与动态类型检查
强制类型转换
原始值与对象
原始值
对象
undefined 和 null
undefined 和 null 的出现
检查 undefined 或 null
undefined 和 null 的历史
更改 undefined
原始值的包装对象
包装对象与原始值不同
包装和解包原始值
原始值从包装器借用方法
类型强制转换
类型强制转换会隐藏错误
转换为布尔值、数字、字符串和对象的函数
算法:ToPrimitive()—将值转换为原始值
第 9 章 运算符
运算符和对象
赋值运算符
复合赋值运算符
相等运算符:=== 与 ==
严格相等 (===, !==)
普通(宽松)相等 (==, !=)
== 没有有效的用例
排序运算符
算法
加法运算符 (+)
算法
布尔值和数字的运算符
特殊运算符
条件运算符 ( ? : )
逗号运算符
void 运算符
通过 typeof 和 instanceof 对值进行分类
typeof:对原始值进行分类
instanceof:检查对象是否是给定构造函数的实例
对象运算符
第 10 章 布尔值
转换为布尔值
手动转换为布尔值
真值和假值
逻辑运算符
二元逻辑运算符:与 (&&) 和或 (||)
逻辑与 (&&)
逻辑或 (||)
逻辑非 (!)
相等运算符、排序运算符
函数 Boolean
第 11 章 数字
数字字面量
指数
调用字面量上的方法
转换为数字
手动转换为数字
parseFloat()
特殊数字值
NaN
Infinity
两个零
数字的内部表示
特殊指数
处理舍入误差
JavaScript 中的整数
整数范围
将整数表示为浮点数
安全整数
转换为整数
通过 Math.floor()、Math.ceil() 和 Math.round() 获取整数
通过自定义函数 ToInteger() 获取整数
通过按位运算符获取 32 位整数
通过 parseInt() 获取整数
算术运算符
按位运算符
背景知识
按位非运算符
二元按位运算符
按位移位运算符
函数 Number
Number 构造函数属性
Number 原型方法
Number.prototype.toFixed(fractionDigits?)
Number.prototype.toPrecision(precision?)
Number.prototype.toString(radix?)
Number.prototype.toExponential(fractionDigits?)
数字函数
本章参考资料
第 12 章 字符串
字符串字面量
字符串字面量中的转义
字符访问
转换为字符串
手动转换为字符串
比较字符串
连接字符串
连接:加法运算符 (+)
连接:连接字符串片段数组
函数 String
String 构造函数方法
String 实例属性 length
String 原型方法
提取子字符串
转换
搜索和比较
使用正则表达式进行测试、匹配和替换
第 13 章 语句
声明和赋值变量
循环和条件语句的主体
循环
与循环一起使用的机制
while
do-while
for
for-in
for each-in
条件语句
if-then-else
switch
with 语句
语法和语义
with 语句已被弃用
弃用理由
debugger 语句
第 14 章 异常处理
什么是异常处理?
JavaScript 中的异常处理
throw
try-catch-finally
示例
错误构造函数
堆栈跟踪
实现你自己的错误构造函数
第 15 章 函数
函数在 JavaScript 中的三种角色
术语:“参数”与“实参”
定义函数
函数表达式
函数声明
函数构造函数
提升
函数的名称
哪个更好:函数声明还是函数表达式?
更多地控制函数调用:call()、apply() 和 bind()
func.apply(thisValue, argArray)
func.bind(thisValue, arg1, ..., argN)
处理缺少或多余的参数
按索引获取所有参数:特殊变量 arguments
强制参数,强制执行最小参数个数
可选参数
模拟按引用传递参数
陷阱:意外的可选参数
命名参数
命名参数作为描述
可选命名参数
在 JavaScript 中模拟命名参数
第 16 章 变量:作用域、环境和闭包
声明变量
背景:静态与动态
背景:变量的作用域
变量是函数作用域的
变量声明会被提升
通过 IIFE 引入新的作用域
IIFE 变体:前缀运算符
IIFE 变体:已在表达式上下文中
IIFE 变体:带有参数的 IIFE
IIFE 应用
全局变量
最佳实践:避免创建全局变量
模块系统导致更少的全局变量
全局对象
跨平台注意事项
window 的用例
环境:管理变量
闭包:函数与其诞生作用域保持连接
通过环境处理闭包
陷阱:无意中共享环境
第 17 章 对象和继承
第一层:单个对象
属性的种类
对象字面量
点运算符 (.):通过固定键访问属性
不常见的属性键
方括号运算符 ([]): 通过计算键访问属性
将任何值转换为对象
this 作为函数和方法的隐式参数
在设置 this 时调用函数:call()、apply() 和 bind()
用于构造函数的 apply()
陷阱:提取方法时丢失 this
陷阱:方法内部的函数会遮蔽 this
第二层:对象之间的原型关系
继承
覆盖
通过原型在对象之间共享数据
获取和设置原型
特殊属性 __proto__
设置和删除仅影响自身属性
属性的迭代和检测
列出自身属性键
列出所有属性键
检查属性是否存在
示例
最佳实践:迭代自身属性
访问器(getter 和 setter)
通过对象字面量定义访问器
通过属性描述符定义访问器
访问器和继承
属性特性和属性描述符
属性特性
属性描述符
通过描述符获取和定义属性
复制对象
属性:定义与赋值
不能为继承的只读属性赋值
可枚举性:最佳实践
保护对象
防止扩展
密封
冻结
陷阱:保护是浅层的
第三层:构造函数—实例的工厂
JavaScript 中实现的 new 运算符
术语:两种原型
实例的 constructor 属性
instanceof 运算符
实现构造函数的技巧
原型属性中的数据
避免使用具有实例属性初始值的原型属性
避免使用非多态原型属性
多态原型属性
保持数据私有
构造函数环境中的私有数据(Crockford 私有模式)
具有标记键的属性中的私有数据
具有具体化键的属性中的私有数据
通过 IIFE 保持全局数据私有
第四层:构造函数之间的继承
继承实例属性
继承原型属性
确保 instanceof 工作正常
覆盖方法
进行超类调用
避免硬编码超类构造函数的名称
示例:构造函数继承的应用
示例:内置构造函数的继承层次结构
反模式:原型是超类构造函数的实例
所有对象的方法
转换为原始值
Object.prototype.toLocaleString()
原型继承和属性
泛型方法:从原型中借用方法
通过字面量访问 Object.prototype 和 Array.prototype
泛型调用方法的示例
类数组对象和泛型方法
所有泛型方法列表
陷阱:将对象用作映射
陷阱 1:继承会影响属性读取
陷阱 2:覆盖会影响方法调用
陷阱 3:特殊属性 __proto__
字典模式:没有原型的对象是更好的映射
最佳实践
备忘单:使用对象
18. 数组
概述
数组是映射,而不是元组
数组也可以有属性
创建数组
数组构造函数
多维数组
数组索引
in 运算符和索引
删除数组元素
数组索引详解
length
手动增加数组长度
减少数组长度
最大长度
数组中的空洞
创建空洞
稀疏数组与密集数组
哪些操作忽略空洞,哪些操作考虑空洞?
从数组中移除空洞
数组构造函数方法
数组原型方法
添加和移除元素(破坏性)
排序和反转元素(破坏性)
比较数字
比较字符串
比较对象
连接、切片、拼接(非破坏性)
搜索值(非破坏性)
迭代(非破坏性)
检查方法
转换方法
归约方法
陷阱:类数组对象
最佳实践:迭代数组
19. 正则表达式
正则表达式语法
原子:常规
原子:字符类
原子:组
量词
断言
析取
Unicode 和正则表达式
创建正则表达式
字面量与构造函数
标志
正则表达式的实例属性
创建正则表达式的示例
RegExp.prototype.test:是否存在匹配项?
String.prototype.search:匹配项位于哪个索引处?
RegExp.prototype.exec:捕获组
首次匹配(未设置标志 /g)
所有匹配项(已设置标志 /g)
String.prototype.match:捕获组或返回所有匹配的子字符串
String.prototype.replace:搜索和替换
替换为字符串
替换为函数
标志 /g 的问题
提示和技巧
引用文本
陷阱:如果没有断言(例如 ^、$),则会在任何位置找到正则表达式
匹配所有内容或不匹配任何内容
手动实现后向查找
正则表达式备忘单
20. 日期
Date 构造函数
Date 构造函数方法
Date 原型方法
时间单位获取器和设置器
各种获取器和设置器
将日期转换为字符串
日期时间格式
日期格式(无时间)
时间格式(无日期)
日期时间格式
时间值:自 1970 年 1 月 1 日以来的毫秒数
将日期转换为数字
21. Math
Math 属性
数值函数
三角函数
其他函数
22. JSON
背景
数据格式
历史
语法
JSON.stringify(value, replacer?, space?)
JSON.stringify() 忽略的数据
toJSON() 方法
JSON.parse(text, reviver?)
通过节点访问器转换数据
JSON.stringify()
JSON.parse()
23. 标准全局变量
构造函数
错误构造函数
非构造函数
编码和解码文本
对数字进行分类和解析
通过 eval() 和 new Function() 动态评估 JavaScript 代码
使用 eval() 评估代码
使用 new Function() 评估代码
eval() 与 new Function()
最佳实践
结论
控制台 API
控制台 API 在不同引擎之间的标准化程度如何?
简单日志记录
检查和计数
格式化日志记录
性能分析和计时
命名空间和特殊值
24. Unicode 和 JavaScript
Unicode 历史
重要的 Unicode 概念
代码点
Unicode 编码
JavaScript 源代码和 Unicode
内部源代码
外部源代码
JavaScript 字符串和 Unicode
转义序列
通过转义引用星形平面字符
计算字符数
Unicode 规范化
JavaScript 正则表达式和 Unicode
匹配任何代码单元和任何代码点
库
推荐阅读和章节来源
25. ECMAScript 5 新增功能
新功能
语法更改
标准库中的新功能
元编程
新方法
JSON
使用旧版浏览器的技巧
IV. 提示、工具和库
26. 元代码风格指南
现有风格指南
一般提示
代码应保持一致
代码应易于理解
普遍接受的最佳实践
大括号样式
优先使用字面量而不是构造函数
不要耍小聪明
可接受的聪明做法
有争议的规则
语法
变量
面向对象
其他
结论
27. 用于调试的语言机制
28. 对内置对象进行子类化
术语
障碍 1:具有内部属性的实例
障碍 1 的解决方法
注意事项
障碍 2:无法作为函数调用的构造函数
障碍 2 的解决方法
另一种解决方案:委托
29. JSDoc:生成 API 文档
JSDoc 基础知识
语法
命名类型
基本标签
记录函数和方法
内联类型信息(“内联文档注释”)
记录变量、参数和实例属性
记录类
通过构造函数定义类
通过对象字面量定义类
通过带有 @constructs 方法的对象字面量定义类
子类化
其他有用标签
30. 库
垫片与 Polyfill
四个语言库
ECMAScript 国际化 API
ECMAScript 国际化 API,版本 1
这是什么类型的标准?
我什么时候可以使用它?
进一步阅读
JavaScript 资源目录
31. 模块系统和包管理器
模块系统
包管理器
快速而粗糙的模块
32. 更多工具
33. 下一步做什么
索引
关于作者
版权页
版权