🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 第1部分 JavaScript快速上手 ## 第1章 基础JavaScript(<b style="color:red">全部完成</b>) 1.1 背景 1.1.1 JavaScript与ECMAScript 1.1.2 JavaScript的影响和本质 1.2 语法 1.2.1 语法概述 1.2.2 语句和表达式 1.2.3 分号 1.2.4 注释 1.3 变量和赋值 1.3.1 赋值 1.3.2 复合赋值运算符 1.3.3 标识符与变量名 1.4 值 7 1.4.1 原始值和对象 1.4.2 原始值 1.4.3 对象 1.4.4 undefined和null 1.4.5 使用typeof和instanceof对值分类 1.5 布尔值 1.5.1 真值与假值 1.5.2 二元逻辑运算符 1.5.3 等式运算符 1.6 数字 1.7 运算符 1.8 字符串 16 1.8.1 字符串运算符 1.8.2 字符串方法 1.9 语句 1.9.1 条件语句 1.9.2 循环语句 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 1.18 标准库的其他功能 # 第2部分 背景(<b style="color:red">全部完成</b>) ## 第2章 为什么选择JavaScript(<b style="color:red">全部完成</b>) 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的性质(<b style="color:red">全部完成</b>) 3.1 古怪和非官方特性 40 3.2 优雅部分 40 3.3 影响 41 ## 第4章 JavaScript是如何创造出来的(<b style="color:red">全部完成</b>) ## 第5章 标准化:ECMAScript(<b style="color:red">全部完成</b>) ## 第6章 JavaScript的历史里程碑(<b style="color:red">全部完成</b>) # 第3部分 深入JavaScript ## 第7章 JavaScript的语法(<b style="color:red">全部完成</b>) 7.1 语法概览 53 7.2 注释 54 7.3 表达式与语句 54 7.3.1 表达式 55 7.3.2 语句 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 严格模式 7.8.1 启用严格模式 7.8.2 严格模式:建议与注意事项 7.8.3 严格模式中,变量必须被声明 7.8.4 严格模式下的函数 7.8.5 严格模式中,设置或者删除不可改变的属性会抛出异常 7.8.6 严格模式中的不合格标识符不能删除 7.8.7 严格模式中,eval更加简洁 7.8.8 严格模式中禁用的特性 ## 第8章 值 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章 运算符** 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章 布尔类型 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章 数字 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章 字符串 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章 异常捕获 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章 函数(<b style="color:red">全部完成</b>) 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, 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章 变量:作用域、环境和闭包(<b style="color:red">全部完成</b>) 16.1 定义变量 16.2 背景知识:静态性和动态性 16.3 背景知识:变量的作用域 16.4 变量以函数为作用域 16.5 变量声明的提前 16.6 通过IIFE引入新的作用域 16.6.1 IIFE变体:前缀运算符 16.6.2 IIFE变体:预内置表达式上下文 16.6.3 IIFE变体:传参的IIFE 16.6.4 IIFE的应用 16.7 全局变量 16.7.1 最佳实践:避免创建全局变量 16.7.2 模块系统可以减少全局变量的引入 16.8 全局对象 16.8.1 跨平台兼容 16.8.2 window的使用场景 16.9 环境:变量的管理 16.10 闭包:使得函数可以维持其创建时所在的作用域 16.10.1 通过环境来控制闭包 16.10.2 陷阱:不经意间的环境共用 ## 第17章 对象与继承 17.1 第1层:单一对象 17.1.1 属性的种类 17.1.2 对象字面量 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 获取和设置原型 17.4.5 特殊属性 __proto__ 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 最佳实践:遍历自有属性 17.7 访问器(getter 和 setter) 17.7.1 通过对象字面量定义访问器 17.7.2 通过属性描述符定义访问器 17.7.3 访问器和继承 17.8 属性特性和属性描述符 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 运算符 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 所有泛型方法列表 17.16 缺陷:Object作为Map使用 17.16.1 缺陷1:继承影响读取属性 263 17.16.2 缺陷2:覆写会影响调用方法 265 17.16.3 缺陷3:特殊属性__proto__ 265 17.16.4 字典模式:没有原型的对象更适合用作映射 266 17.16.5 最佳实践 17.17 备忘录:对象的使用 **第18章 数组** 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章 正则表达式** 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 陷阱:缺少断言(例如^、$)的正则表达式可以在任意位置匹配 19.10.3 匹配一切或什么都不匹配 19.10.4 手动实现逆向查找 19.11 正则表达式备忘单 310 ## 第20章 Date 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开始的毫秒数 ## 第21章 Math 21.1 Math属性 323 21.2 数值函数 324 21.3 三角函数 325 21.4 其他函数 327 ## 第22章 JSON 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章 标准全局变量 23.1 构造器 23.2 Error构造器 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 最佳实践 23.4.5 结论 23.5 Console API 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 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的新特性 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部分 技巧、工具和类库 **第26章 元编程风格指南** 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章 调试的语言机制 ## 第28章 子类化内置构造函数(<b style="color:red">全部完成</b>) 28.1 术语 28.2 障碍1:具有内部属性的实例 28.2.1 障碍1的解决方法 28.2.2 注意 28.3 障碍2:内置的构造函数不能作为方法调用 28.4 另一种解决方案:委托 ## 第29章 JSDoc:生成API文档** 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章 类库 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章 模块系统和包管理器(<b style="color:red">全部完成</b>) 31.1 模块系统 31.2 包管理器 31.3 简单粗暴的模块实现 ## 第32章 其他工具 ## 第33章 接下来该做什么(<b style="color:red">全部完成</b>)