目录 序 1 前言 3 第1章 重构是什么? 13 你如何保证不改变行为? 13 如果不改变行为,重构的目的是什么? 18 重构是什么,不是什么 21 小结 22 第2章 你使用哪种JavaScript? 23 版本与规范 24 平台与实现 25 预编译语言 26 框架 27 库 29 你需要什么JavaScript? 29 我们在用什么JavaScript? 30 小结 30 第3章 测试 31 为什么测试 34 测试的多种方法 35 工具和流程 43 小结 52 第4章 测试实践 53 从零开始的代码 55 采用测试驱动开发的从零开始的代码 61 未经测试的代码与特性测试 80 调试和回归测试 85 小结 93 第5章 基本重构目标 95 函数块 98 输入 101 输出 106 副作用 109 上下文第一部分:隐式输入 110 上下文第二部分:隐私 116 小结 128 第6章 重构基本结构 130 示例代码132 我们的信心策略 135 重命名 137 无用的代码 142 变量 148 字符串 157 使用数组:循环、forEach、映射 161 小结 167 第7章 重构函数与对象 168 示例代码(改进后) 168 数组和对象的替代品 171 测试我们所拥有的 179 提取函数185 用全局对象简化API 192 小结 246 第8章 层次结构中的重构 247 关于“CRUD应用”和框架247 构建层次结构 248 破坏层次结构 256 继承与结构 264 Has-A关系 270 继承反模式 271 小结 280 第9章 重构到面向对象模式 281 模板方法282 策略 285 状态 288 空对象 295 包装(装饰器和适配器) 302 外观 310 小结 313 第10章 重构异步 315 为什么用异步? 315 修复金字塔厄运 318 回调和测试 326 Promises 330 小结 336 第11章 函数式重构 337 函数式编程的限制和好处 338 基础 344 高级基础358 Burritos 369 学习和使用Burritos 383 从OOP迁移到FP 385 小结 390 第12章 结论 392 附录A 进一步阅读和资源 393