
内容介绍
《深入理解javascript》是一本全面、深入介绍JavaScript语言的学习指南。本书共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局变量、编码和JavaScript、ECMAScript 5的新特性等内容;第4部分介绍技巧、工具和类库,帮助读者更好地运用JavaScript进行编程。本书包括以下内容:
JavaScript快速上手:更习惯面向对象的编程?这个部分会帮你更快更好地开始学习JavaScript。
背景:了解JavaScript的历史,以及它与其他语言之间的关系。
深入JavaScript:详细学习ECMAScript 5,从语法,变量,函数,面向对象编程,再到正则表达式和JSON,以及大量的示例。
技巧、工具和类库:对现有风格指引、实践、高阶技术、模块系统、包管理、构建工具进行调研和学习。

深入理解javascript章节目录
第1部分 JavaScript快速上手第1章 基础JavaScript31.1 背景31.1.1 JavaScript与ECMAScript31.1.2 JavaScript的影响和本质31.2 语法41.2.1 语法概述41.2.2 语句和表达式51.2.3 分号51.2.4 注释61.3 变量和赋值61.3.1 赋值61.3.2 复合赋值运算符61.3.3 标识符与变量名61.4 值71.4.1 原始值和对象81.4.2 原始值91.4.3 对象91.4.4 undefined和null101.4.5 使用typeof和instanceof对值分类111.5 布尔值131.5.1 真值与假值131.5.2 二元逻辑运算符141.5.3 等式运算符141.6 数字141.7 运算符151.8 字符串161.8.1 字符串运算符161.8.2 字符串方法171.9 语句171.9.1 条件语句171.9.2 循环语句181.10 函数191.10.1 函数声明的提升特性191.10.2 特殊的变量arguments201.10.3 参数太多或太少201.10.4 可选参数201.10.5 强制参数长度211.10.6 将arguments转换为数组211.11 异常捕获211.12 严格模式221.13 变量作用域和闭包221.13.1 变量是函数作用域的231.13.2 变量的提升特性231.13.3 闭包231.13.4 IIFE模式:引入一个新的作用域241.14 对象和构造函数251.14.1 单一对象251.14.2 任意属性名261.14.3 提取方法261.14.4 方法中的函数271.14.5 构造函数:对象工厂281.15 数组291.15.1 数组字面量291.15.2 数组方法301.15.3 遍历数组301.16 正则表达式311.16.1 test()方法:匹配吗311.16.2 exec()方法:匹配以及捕获分组311.16.3 replace()方法:搜索和替换311.17 Math321.18 标准库的其他功能32第2部分 背景第2章 为什么选择JavaScript352.1 JavaScript可以自由使用吗352.2 JavaScript优雅吗362.3 JavaScript有用吗362.3.1 图形用户界面362.3.2 其他技术补充完善JavaScript362.4 JavaScript有什么好用的工具吗372.5 JavaScript是否足够快372.6 JavaScript是广泛使用的吗382.7 JavaScript有前途吗382.8 结论38第3章 JavaScript的性质393.1 古怪和非官方特性403.2 优雅部分403.3 影响41第4章 JavaScript是如何创造出来的42第5章 标准化:ECMAScript44第6章 JavaScript的历史里程碑46第3部分 深入JavaScript第7章 JavaScript的语法537.1 语法概览537.2 注释547.3 表达式与语句547.3.1 表达式557.3.2 语句557.4 控制流语句和块577.5 使用分号的规则577.5.1 以块结束的语句后面没有分号587.5.2 空语句587.5.3 自动分号插入597.6 合法标识符607.7 数字字面量的方法调用627.8 严格模式627.8.1 启用严格模式627.8.2 严格模式:建议与注意事项637.8.3 严格模式中,变量必须被声明637.8.4 严格模式下的函数637.8.5 严格模式中,设置或者删除不可改变的属性会抛出异常657.8.6 严格模式中的不合格标识符不能删除657.8.7 严格模式中,eval更加简洁667.8.8 严格模式中禁用的特性66第8章 值678.1 JavaScript中的类型体系678.1.1 JavaScript类型678.1.2 静态与动态688.1.3 静态类型与动态类型688.1.4 静态类型检查和动态类型检查688.1.5 强制转换698.2 原始值和对象698.2.1 原始值708.2.2 对象708.3 undefined和null728.3.1 undefined和null的出现场景728.3.2 检测undefined和null738.3.3 undefined和null的历史748.3.4 修改undefined758.4 原始值的包装对象768.4.1 包装对象不同于原始值768.4.2 原始值的包装与去包装768.4.3 原始值从包装器借调方法778.5 强制类型转换788.5.1 强制类型转换会隐藏bug788.5.2 转换成布尔值、数字、字符串和对象的函数788.5.3 算法:ToPrimitive()—将值转换为原始值80第9章 运算符829.1 运算符和对象829.2 赋值运算符829.3 等号运算符:=== 和 ==849.3.1 严格相等(===,!==)849.3.2 普通(宽松)相等(==,!=)859.3.3 没有针对==的有效用例879.4 排序运算符889.5 加号运算符(+)899.6 布尔运算符和数字运算符909.7 特殊运算符909.7.1 条件运算符(?:)909.7.2 逗号运算符919.7.3 void运算符919.8 通过typeof和instanceof判断值类型939.8.1 typeof:判断原始值939.8.2 instanceof:检测对象是否是给定构造函数的实例959.9 对象运算符96第10章 布尔类型9710.1 转换成布尔值9710.1.1 手动转换为布尔值9710.1.2 真值和假值9810.2 逻辑运算符9910.2.1 二元逻辑运算符:与(&&)和或(||)9910.2.2 逻辑与(&&)10010.2.3 逻辑或(||)10010.2.4 逻辑非(!)10110.3 等号运算符、排序运算符10110.4 Boolean函数102第11章 数字10311.1 数字字面量10311.1.1 说明10311.1.2 在字面量上调用方法10411.2 转换成数字10411.2.1 手动转换为数字10411.2.2 parseFloat()10511.3 特殊的数字值10611.3.1 NaN10611.3.2 Infinity10811.3.3 两个010911.4 数字的内部表示11111.5 处理舍入错误11211.6 JavaScript中的整型11411.6.1 整型的范围11411.6.2 将整型表示为浮点数字11511.6.3 安全的整型11611.7 转换成整数11711.7.1 通过Math.floor(),Math.ceil()和Math.round()得到整数11811.7.2 通过定制函数ToInteger()得到整数11911.7.3 通过位运算符得到32位整数11911.7.4 通过parseInt()得到整数12111.8 算术运算符12211.9 位运算符12511.9.1 背景知识12511.9.2 位运算非操作符12611.9.3 二进制位运算符12611.9.4 位运算移位操作符12711.10 Number函数12811.11 Number构造器属性12811.12 Number原型方法12911.12.1 Number.prototype.toFixed(fractionDigits?)12911.12.2 Number.prototype.toPrecision(precision?)13011.12.3 Number.prototype.toString(radix?)13011.12.4 Number.prototype.toExponential(fractionDigits?)13111.13 用于数字的函数13211.14 本章参考资料132第12章 字符串13312.1 字符串字面量13312.2 字符串字面量中的转义字符13412.3 字符访问13512.4 转换为字符串13512.5 字符串比较13712.6 字符串拼接13712.6.1 合并:加号(+)运算符13712.6.2 合并:拼接字符串数组13812.7 字符串函数13812.8 字符串构造器方法13812.9 字符串length属性13912.10 字符串原型方法13912.10.1 提取子字符串13912.10.2 字符串的变换14112.10.3 字符串的检索和比较14212.10.4 支持正则表达式的方法143第13章 语句14513.1 声明和变量赋值14513.2 循环语句和条件语句的主体14513.3 循环14613.3.1 循环的机制14613.3.2 while14713.3.3 do-while14713.3.4 for14713.3.5 for-in14813.3.6 for each-in15013.4 条件语句15013.4.1 if-then-else15013.4.2 switch15113.5 with语句15313.5.1 语法与语义15313.5.2 with语句已被废弃15413.5.3 废弃with的原因15413.6 debugger语句156第14章 异常捕获15714.1 什么是异常捕获15714.2 JavaScript中的异常捕获15814.2.1 throw15914.2.2 try-catch-finally15914.2.3 例子16014.3 Error构造器16114.4 栈跟踪16214.5 实现一个自己的异常构造器163第15章 函数16415.1 JavaScript中函数的3种形式16415.2 术语:“形参”和“实参”16515.3 定义函数16515.3.1 函数表达式16615.3.2 函数声明16715.3.3 Function构造器16715.4 函数提升16715.5 函数的名称16815.6 哪个更好,函数声明还是函数表达式16815.7 控制函数调用:call(),apply()和bind()16915.7.1 func.apply(thisValue, argArray)16915.7.2 func.bind(thisValue, arg1, ..., argN)17015.8 参数缺失或者超出时的处理17015.8.1 通过索引访问所有参数:神奇的arguments变量17015.8.2 强制性参数,限制参数数量的最小值17215.8.3 可选参数17315.8.4 模拟参数的引用传递17315.8.5 陷阱:非预期的可选参数17415.9 具名参数17515.9.1 具名参数可作为描述信息17515.9.2 可选的具名参数17615.9.3 在JavaScript中模拟具名参数176第16章 变量:作用域、环境和闭包17716.1 定义变量17716.2 背景知识:静态性和动态性17716.3 背景知识:变量的作用域17816.4 变量以函数为作用域17916.5 变量声明的提前18016.6 通过IIFE引入新的作用域18116.6.1 IIFE变体:前缀运算符18216.6.2 IIFE变体:预内置表达式上下文18316.6.3 IIFE变体:传参的IIFE18316.6.4 IIFE的应用18316.7 全局变量18416.7.1 最佳实践:避免创建全局变量18416.7.2 模块系统可以减少全局变量的引入18516.8 全局对象18516.8.1 跨平台兼容18616.8.2 window的使用场景18616.9 环境:变量的管理18816.10 闭包:使得函数可以维持其创建时所在的作用域19116.10.1 通过环境来控制闭包19116.10.2 陷阱:不经意间的环境共用193第17章 对象与继承19517.1 第1层:单一对象19517.1.1 属性的种类19517.1.2 对象字面量19617.1.3 点运算符(.):通过固定键值访问属性19717.1.4 特殊的属性键19917.1.5 中括号操作符([]):通过计算出的键访问属性19917.2 把任意值转化为对象20117.3 this作为函数和方法的隐式参数20217.3.1 在调用函数时设置 this:call(),apply()和bind()20217.3.2 “用于构造函数的 apply()”详细阐述了如何配合构造函数使用apply()20317.3.3 用于构造函数的apply()20417.3.4 缺陷:提取方法时丢失 this20617.3.5 缺陷:方法中的函数会掩盖 this20717.4 第2层:对象间的原型关系20917.4.1 继承20917.4.2 覆写21017.4.3 通过原型在对象间共享数据21017.4.4 获取和设置原型21117.4.5 特殊属性 __proto__21317.4.6 设置和删除仅影响自有属性21417.5 遍历和检测属性21517.5.1 列出自有的属性键21517.5.2 列出所有的属性键21617.5.3 检测属性是否存在21617.5.4 示例21717.6 最佳实践:遍历自有属性21817.7 访问器(getter 和 setter)21817.7.1 通过对象字面量定义访问器21917.7.2 通过属性描述符定义访问器21917.7.3 访问器和继承21917.8 属性特性和属性描述符22017.8.1 属性特性22017.8.2 属性描述符22117.8.3 通过描述符获取和定义属性22117.8.4 复制对象22317.8.5 属性:定义与赋值22417.8.6 继承的只读属性不能被赋值22517.8.7 枚举性:最佳实践22517.9 保护对象22617.9.1 防止扩展22617.9.2 封闭22717.9.3 冻结22817.9.4 缺陷:保护是浅层的22917.10 第3层:构造函数—实例工厂22917.10.1 JavaScript 中 new 操作符的实现23117.10.2 术语:两个原型23117.10.3 实例的 constructor 属性23217.10.4 instanceof 运算符23417.10.5 实现构造函数的小技巧23717.11 原型属性中的数据23817.11.1 对于实例属性,避免使用带初始值的原型属性23817.11.2 避免非多态的原型属性24017.11.3 多态的原型属性24117.12 保持数据私有性24117.12.1 构造函数环境中的私有数据(Crockford私有模式)24117.12.2 使用标记的键的属性保存私有数据24517.12.3 使用具体化键的属性保存私有数据24617.12.4 通过IIFE保持全局数据私有24717.13 第4层:构造函数之间的继承24817.13.1 继承实例属性24917.13.2 继承原型属性24917.13.3 确保instanceof正常工作25017.13.4 覆写方法25117.13.5 父调用25117.13.6 避免硬编码父构造函数的名字25217.13.7 示例:构造函数继承25317.13.8 示例:内建构造函数的继承层次结构25417.13.9 反模式:原型是父构造函数的实例25417.14 所有对象的方法25417.14.1 转换为原始值25417.14.2 Object.prototype.toLocaleString()25517.14.3 原型式继承和属性25517.15 泛型方法:借用原型方法25617.15.1 通过字面量访问Object.prototype和Array.prototype25717.15.2 调用泛型方法的例子25817.15.3 类似数组的对象和泛型方法25917.15.4 所有泛型方法列表26117.16 缺陷:Object作为Map使用26317.16.1 缺陷1:继承影响读取属性26317.16.2 缺陷2:覆写会影响调用方法26517.16.3 缺陷3:特殊属性__proto__26517.16.4 字典模式:没有原型的对象更适合用作映射26617.16.5 最佳实践26717.17 备忘录:对象的使用267第18章 数组26918.1 概述26918.1.1 数组是映射,不是元组27018.1.2 数组也可以具有属性27018.2 创建数组27018.2.1 数组构造函数27118.2.2 多维数组27118.3 数组索引27218.3.1 操作符in与索引27318.3.2 删除数组元素27318.3.3 数组索引的细节27318.4 长度27518.4.1 手动增加数组的长度27518.4.2 减少数组的长度27618.4.3 最大长度27718.5 数组中的“空缺”27718.5.1 创建空缺27818.5.2 稀疏数组和密集数组27818.5.3 哪些操作会忽略空缺,而哪些不会27918.5.4 移除数组中的空缺28018.6 数组构造函数28118.7 数组原型方法28118.8 添加和删除元素(破坏性地)28118.9 排序和颠倒元素顺序(破坏性地)28318.9.1 比较数字28418.9.2 比较字符串28418.9.3 比较对象28418.10 合并、切分和连接(非破坏性地)28518.11 值的查找(非破坏性地)28618.12 迭代(非破坏性地)28718.12.1 检测方法28718.12.2 转化方法28918.12.3 归约函数28918.13 缺陷:类数组对象29118.14 最佳实践:遍历数组291第19章 正则表达式29319.1 正则表达式语法29319.1.1 原子:常规29319.1.2 原子:字符类29519.1.3 原子:分组29619.1.4 量词29619.1.5 断言29719.1.6 析取(或)29819.2 Unicode 和正则表达式29819.3 创建正则表达式29819.3.1 字面量与构造函数29919.3.2 标识29919.3.3 正则表达式的实例属性29919.3.4 几个创建正则表达式的例子30019.4 RegExp.prototype.test:是否存在匹配30019.5 String.prototype.search:匹配位置的索引30119.6 RegExp.prototype.exec:捕获分组30119.6.1 首次匹配(不设置标识/g)30219.6.2 全部匹配(设置标识 /g)30219.7 String.prototype.match:捕获分组或返回所有匹配的子字符串30319.8 String.prototype.replace:查找和替换30319.8.1 Replacement 为字符串的情况30419.8.2 当Replacement为函数时30519.9 标识 /g 的一些问题30519.10 提示与技巧30819.10.1 引用文本30819.10.2 陷阱:缺少断言(例如^、$)的正则表达式可以在任意位置匹配30819.10.3 匹配一切或什么都不匹配30819.10.4 手动实现逆向查找30919.11 正则表达式备忘单310第20章 Date31320.1 Date构造函数31320.2 Date构造函数方法31520.3 Date原型方法31520.3.1 时间单位的getter和setter方法31620.3.2 各种各样的getter和setter方法31720.3.3 将日期转换成字符串31720.4 日期和时间格式31920.4.1 日期格式(无时间)31920.4.2 时间格式(无日期)32020.4.3 日期时间格式32120.5 时间值:从1970-01-01开始的毫秒数321第21章 Math32321.1 Math属性32321.2 数值函数32421.3 三角函数32521.4 其他函数327第22章 JSON32922.1 背景32922.1.1 数据格式32922.1.2 历史33022.1.3 语法33022.2 JSON.stringify(value, replacer?, space?)33422.2.1 被JSON.stringify()忽略的数据33522.2.2 toJSON()方法33622.3 JSON.parse(text, reviver?)33722.4 通过节点访问函数转换数据33822.4.1 JSON.stringify()33922.4.2 JSON.parse()339第23章 标准全局变量34123.1 构造器34123.2 Error构造器34223.3 非构造器函数34223.3.1 文字的编码和解码34223.3.2 数值归类与数值转换34323.4 通过eval()和new Function()来动态执行JavaScript代码34423.4.1 使用eval()执行代码34423.4.2 通过new Function()执行代码34623.4.3 eval()与new Function()比较34723.4.4 最佳实践34723.4.5 结论34723.5 Console API34823.5.1 Console API在各引擎的标准程度如何34823.5.2 简单的日志记录34923.5.3 检查和计数35023.5.4 格式化的日志35023.5.5 性能和时间35223.6 名称空间和特殊值353第24章 编码和JavaScript35424.1 Unicode历史35424.2 Unicode中的重要概念35424.3 码位35624.4 Unicode编码35724.5 JavaScript源码和Unicode35924.5.1 内部源码转化35924.5.2 源码外部转化35924.6 JavaScript字符串和Unicode36124.6.1 转义序列36124.6.2 通过转义引用星际平面的字符36124.6.3 字符长度计算36224.6.4 Unicode正常化36224.7 JavaScript正则表达式和Unicode36324.7.1 匹配任意的码元以及任意的码位36424.7.2 库36424.7.3 推荐阅读的章节资源364第25章 ECMAScript 5的新特性36625.1 新特性36625.2 语法的改变36725.3 标准库的新功能36725.3.1 元编程36725.3.2 新方法36825.3.3 JSON36925.4 兼容旧浏览器的小贴士370第4部分 技巧、工具和类库第26章 元编程风格指南37326.1 现有风格指南37326.2 通用技巧37426.2.1 代码应该具有一致性37426.2.2 代码应该易于理解37426.3 普遍认可的最佳实践37526.3.1 括号风格37626.3.2 推荐字面量而不是构造函数37726.3.3 不要自作聪明37826.3.4 可接受的技巧37926.4 具有争议的规则38026.4.1 语法38026.4.2 变量38126.4.3 面向对象38226.4.4 其他38326.5 结论384第27章 调试的语言机制385第28章 子类化内置构造函数38628.1 术语38628.2 障碍1:具有内部属性的实例38628.2.1 障碍1的解决方法38828.2.2 注意38928.3 障碍2:内置的构造函数不能作为方法调用38928.4 另一种解决方案:委托390第29章 JSDoc:生成API文档39229.1 JSDoc基础39329.1.1 语法39329.1.2 命名类型39429.2 基础的标签39529.3 文档记录函数和方法39629.4 行内类型信息(“行内文档注释”)39729.5 文档记录变量、参数和实例属性39729.6 文档记录类39829.6.1 通过构造函数定义类39929.6.2 通过对象字面量定义类39929.6.3 通过带有@constructs方法的对象字面量定义类40029.6.4 子类40029.7 其他有用的标签401第30章 类库40230.1 shim和polyfill40230.2 四个语言类库40330.3 ECMAScript的国际化API40330.3.1 ECMAScript的国际化API,第1版40330.3.2 它是怎么样的标准呢40430.3.3 知识兔可以用它做什么40430.3.4 延伸阅读40430.4 JavaScript资源目录405第31章 模块系统和包管理器40731.1 模块系统40731.2 包管理器40831.3 简单粗暴的模块实现408第32章 其他工具410第33章 接下来该做什么412
使用说明
1、下载并解压,得出pdf文件2、如果打不开本文件,请务必下载pdf阅读器
3、安装后,在打开解压得出的pdf文件
4、双击进行阅读>
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验