本书是一本学习JavaScript语言的权威书籍,在遵循语言学习的特殊规律基础上精心选材,力争做到统筹、有序,在结构上体现系统性和完整性。同时还重点挖掘JavaScript基于对象的开发精髓及函数式编程两个技术核心。
本书内容全面,由浅入深,包括6篇21章,主要内容包括:JavaScript语言的基本特性,开发简单的JavaScript程序,JavaScript 语法体系,数据、数据类型和变量,运算符和表达式,语句和结构,JavaScript函数, JavaScript对象,数组,字符串,使用正则表达式操纵字符串,客户端,控制文档结构的模型,JavaScript事件驱动模型,CSS,Cookie,XML和JSON,Ajax,深入 JavaScript面向对象编程,深入JavaScript函数式编程,深入JavaScript动态化编程等。
本书适用于具有一定程序开发基础、准备学习JavaScript语言或希望提高JavaScript语言技巧的读者,还可作为相关培训班的教材。
图书目录:
第1篇 壮志从戎
第1章 与初学者谈谈JavaScript学习 3
1.1 学之初,你应该清楚的几个概念 3
1.1.1 B/S和C/S 3
1.1.2 RWC和RIA 4
1.1.3 结构、行为和表现 4
1.2 审视JavaScript语言特性 5
1.2.1 JavaScript是一门灵活的脚本语言 5
1.过程化设计 6 2.定义原型方法 6
3.封装原型方法 6 4.造车不如设计标准 7
5.方法接龙 7 6.实例体验 8
1.2.2 JavaScript是基于对象的语言 8
1.万物皆为对象 8 2.奇怪的指针 9
3.灵活的用法 9
1.2.3 JavaScript是函数式语言 10
1.八面玲珑的函数 10 2.函数的作用域 11
3.奇怪的函数闭包 11 4.函数的上下文对象 11
1.3 JavaScript语言风云录 12
1.3.1 JavaScript寻根 12
1.3.2 三国志—JavaScript、JScript和ECMAScript 13
1.3.3 一个好汉三个帮—客户端的JavaScript实现 14
1.DOM 15 2.BOM 15
1.3.4 春秋五霸—令人生畏的浏览器混战和兼容 16
1.Mozilla 16 2.IE 16
3.Safari 17 4.Opera 17
5.Chrome 17 6.浏览器兼容方法 17
1.4 JavaScript运行环境 18
1.4.1 宿主环境 18
1.4.2 执行期环境 19
1.5 JavaScript解析机制 19
1.5.1 预编译 19
1.5.2 执行期 22
1.6 JavaScript执行顺序 23
1.6.1 按HTML文档流顺序执行JavaScript代码 23
1.6.2 预编译与执行顺序的关系 24
1.6.3 按块执行JavaScript代码 25
1.6.4 借助事件机制改变JavaScript执行顺序 26
1.6.5 JavaScript输出脚本的执行顺序 26
1.7 JavaScript应用范围 29
1.7.1 客户端的JavaScript 29
1.7.2 服务器端的JavaScript 30
1.7.3 其他环境的JavaScript 30
1.8 JavaScript开发工具箱 30
1.8.1 关于Web浏览器 30
1.8.2 关于JavaScript编辑器 31
1.8.3 关于JavaScript测试和调试工具 31
1.浏览器的错误控制平台 31 2.Firebug 33
3.HttpWatch 33 4.Web Developer Toolbar 34
5.JavaScript Debuger 34
第2章 Hello,World—JavaScript开发初体验 35
2.1 杨辉三角—第一个JavaScript程序 35
2.1.1 万物皆有规律—问题分析 37
2.1.2 递归算法设计 38
2.1.3 优化算法设计 39
2.1.4 输出杨辉三角 39
2.2 在网页中嵌入JavaScript脚本 40
2.2.1 使用script元素嵌入脚本 40
1.设置脚本类型 41 2.导入外部脚本文件 41
3.设置脚本的字符编码 42 4.设置脚本延迟执行 42
5.设置脚本在服务器端执行 42
2.2.2 探析外部脚本文件 42
1.导入外部脚本文件 43 2.何时使用外部JavaScript脚本文件 44
2.2.3 注意JavaScript脚本文件的关联性 44
2.2.4 使用接口技术解决JavaScript文件冲突 45
2.2.5 JavaScript文件与CSS文件导入和执行冲突 46
2.2.6 <script>标签在文档中的位置 48
2.2.7 杞人忧天—隐藏JavaScript脚本 49
2.2.8 关注细节—使用noscript元素 49
2.3 纠正编码习惯 50
2.3.1 JavaScript编码基本规范 51
1.JavaScript文件规范 51 2.代码缩进 51
3.代码长度 51 4.代码注释 51
5.变量声明 52 6.函数声明 52
7.标识符命名 52 8.语句 53
9.标签 53
2.3.2 思路梳理器—写好注释 53
1.单行注释 53 2.多行注释 54
2.3.3 留白的艺术—格式化代码 55
1.使用空行分隔代码块 55 2.空格是代码稀释剂 55
3.嵌套与缩进 55 4.换行缩进 56
5.大括号的位置 56 6.空结构的格式 56
7.单句结构的格式 56
2.4 程序调试 57
2.4.1 简单的手工调试 57
2.4.2 使用1st JavaScript Editor调试器进行调试 58
1.逐步调试 59 2.断点 60
3.观察 60
2.4.3 使用Microsoft Script Debugger进行调试 61
2.4.4 异常处理 63
1.异常处理的基本结构 64 2.异常处理中的兼容问题 64
3.打扫战场 66
第2篇 沙场秋点兵
第3章 运筹帷幄—俯瞰JavaScript语法体系 69
3.1 JavaScript语言词法基础 69
3.1.1 从字符编码开始接触JavaScript语言 70
3.1.2 认识JavaScript的实词和虚词概念 71
3.1.3 对大小写比较敏感的实词 72
3.1.4 实词类型 73
1.标识符 73 2.直接量 74
3.保留字 74
3.1.5 虚词类型 74
1.无意义的分隔符 75 2.有意义的分隔符 75
3.注释 76
3.2 JavaScript语言句法基础 77
3.2.1 认识句法三要素:词、句和段 77
1.段落 77 2.句子 78
3.词语 78
3.2.2 点号—逻辑域定位符 79
3.2.3 逗号—连续运算符 80
3.2.4 分号—语句分隔符 81
3.2.5 冒号—逻辑声明符 82
3.2.6 大括号—逻辑域分隔符 82
3.2.7 中括号—有序列表分隔符 84
3.2.8 小括号—强制运算符或逻辑分隔符 85
第4章 JavaScript血液系统—数据、数据类型和变量 89
4.1 从数据到类型 89
4.1.1 数据的本质 89
4.1.2 柔弱的JavaScript语言 90
4.1.3 JavaScript的基本数据类型 91
4.1.4 数之源—值类型和引用类型 92
4.1.5 原始值和引用值的操作本质 93
1.使用原始值 93 2.使用引用值 94
4.2 值类型数据 96
4.2.1 线性思维的符号—数值 96
1.数值直接量 96 2.八进制和十六进制数值 97
3.数值运算 97 4.特殊数值 98
4.2.2 形象思维的颜料—字符串 99
1.字符串直接量 99 2.转义序列 100
3.字符串操作 100
4.2.3 逻辑思维的卵细胞—布尔型 101
4.2.4 空无道人—null 101
4.2.5 人之初—undefined 102
4.3 引用类型数据 103
4.3.1 有序数据结构—数组 104
1.数组意象 104 2.第一次接触数组 105
4.3.2 离散数据结构—对象 105
1.对象意象 106 2.第一次接触对象 106
4.3.3 魔兽数据—函数 108
1.函数意象 108 2.大话函数演绎之路 108
3.探究奇特的函数解析机制 110
4.4 数据类型检测和转换 112
4.4.1 数据类型检测 113
1.使用typeof运算符 113 2.使用constructor属性 113
3.框架窗口的数组类型问题 114 4.设计更安全的数据类型检测方法 115
4.4.2 值类型数据的自动转换 117
4.4.3 引用型数据的自动转换 118
1.对象在逻辑运算环境中的
特殊情况 118 2.对象在数值运算环境中的
特殊情况 118
3.数组在数值运算环境中的
特殊情况 119 4.对象在模糊运算环境中的
情况处理 119
4.4.4 把值转换为字符串 120
1.使用加号运算符 120 2.圆滑的加号运算符 122
3.使用toString()方法 122 4.数字转换为字符串的模式问题 122
5.数字转换为字符串的位数问题 123
4.4.5 把值转换为数字 124
1.使用parseInt()函数 124 2.使用parseFloat()函数 125
3.使用乘号运算符 125
4.4.6 把值转换为布尔值 125
1.使用双重逻辑非运算符 125 2.使用Boolean()构造函数转换 126
4.4.7 装箱和拆箱 126
1.从值到引用—装箱 126 2.从引用到值—拆箱 127
4.4.8 数据类型的强制转换 128
4.5 使用变量 129
4.5.1 声明变量 129
1.变量声明的方法 129 2.3种变量命名法 130
4.5.2 丑陋的JavaScript变量 131
1.陋习一:变量没有类型 131 2.陋习二:变量可以重复声明 131
3.陋习三:变量可以隐式声明 132 4.陋习四:变量的灰色潜规则 132
4.5.3 不可跨越的门槛—变量的作用域 133
1.变量优先级问题 133 2.局部作用域的嵌套 134
3.利用函数作用域实现技术封装 134 4.变量的解析过程 135
5.被JavaScript忽略的块级作用域 136 6.函数闭包的作用域 136
4.5.4 圈里圈外—属性与变量 137
1.全局变量是全局对象的属性 137 2.局部变量是调用对象的属性 138
4.5.5 变量的作用域链 138
4.5.6 变量的垃圾回收 139
第5章 JavaScript肌肉系统—运算符、表达式 141
5.1 说说运算符和表达式 141
5.1.1 语言实际上就是数据和运算的交流工具 141
5.1.2 运算符是运算的解码器 142
5.1.3 走入运算符的童话世界 143
5.1.4 领略运算符的魔法法则 144
5.1.5 运算的人性化,还是随意性 146
5.1.6 警惕运算符的副作用 147
5.1.7 表达式是运算的最小逻辑单元 148
5.1.8 优化表达式的思维品质 148
5.2 天人合一——位运算符 151
5.2.1 位运算是整数的逐位运算 151
5.2.2 探秘二进制数运算奥秘 151
5.2.3 逻辑位运算 153
5.2.4 移位运算 155
5.3 童年无忌—算术运算符 157
5.3.1 加法的特殊运算 157
5.3.2 减法的特殊运算 158
5.3.3 乘法的特殊运算 159
5.3.4 除法的特殊运算 159
5.3.5 取模的特殊运算 160
5.3.6 取反运算 160
5.3.7 心脏起搏器—递增和递减 160
5.4 离散思维—字符串运算符 161
5.5 真真假假论乾坤—逻辑运算符 161
5.5.1 逻辑与运算 162
5.5.2 逻辑或运算符 164
5.5.3 逻辑非运算符 166
5.5.4 逻辑思维训练 166
5.6 货比三家—关系运算符 168
5.6.1 大小关系检测 168
5.6.2 包含关系检测 169
5.6.3 等值关系检测 170
5.7 复制数据—赋值运算符 172
5.8 对象操作运算符 174
5.8.1 女娲造人—new运算符 174
5.8.2 垃圾回收站—delete运算符 175
5.8.3 I/O接口—存取运算符 177
1.中括号运算符 177 2.点号运算符 178
5.8.4 光盘驱动器—函数调用运算符 179
5.9 其他运算符 180
5.9.1 迷你版分支逻辑—条件运算符 180
5.9.2 期待与收获—逗号运算符 181
5.9.3 俯首甘为孺子牛—void运算符 182
5.9.4 身份验证—类型检测运算符 183
第6章 JavaScript神经骨骼系统—语句、结构 185
6.1 从表达式到语句 185
6.1.1 什么是句子 186
6.1.2 两面性—表达式、表达式语句 188
6.1.3 群居性—复合语句 189
6.1.4 形影相随—句子、结构 190
6.1.5 不被执行的—声明语句 191
6.1.6 语句占位符—空语句 193
6.2 分支结构 193
6.2.1 if语句 193
6.2.2 if结构嵌套 194
1.错误的嵌套 194 2.正确的嵌套 195
6.2.3 else if语句 195
6.2.4 预防if结构嵌套的主观性 196
6.2.5 if结构中容易躲藏的Bug 197
6.2.6 switch语句 198
6.2.7 悟透default从句用法 200
6.2.8 恰当选用if结构和switch结构 202
6.2.9 分支结构中逻辑顺序的优化 204
6.3 循环结构 205
6.3.1 while语句 205
6.3.2 do/while语句 207
6.3.3 for语句 207
6.3.4 for/in语句 209
6.3.5 灵活使用for/in结构 210
6.3.6 如何正确选用while和for结构 212
1.从语义性角度比较 212 2.从思维模式角度比较 212
3.从达成目标角度比较 214
6.3.7 优化循环结构和提高循环效率 215
1.优化结构 215 2.避免不必要的重复操作 216
3.妥善定义循环变量 216
6.4 结构的逻辑干预 216
6.4.1 有序思维的锚点—标签语句 217
6.4.2 跳出往后执行—break语句 218
6.4.3 继续重新执行—continue语句 220
6.5 逻辑异常处理 222
6.5.1 剖析异常和异常种类 222
6.5.2 知法犯法—throw语句 223
6.5.3 异常处理器—try/catch/finally语句 223
6.6 函数体结构 225
6.6.1 惰性气体—function语句 225
6.6.2 函数输出接口—return语句 227
6.7 临时作用域结构—with语句 228
第3篇 初战告捷
第7章 盒子里的魔术——透视JavaScript函数 233
7.1 认识函数 233
7.1.1 函数是一段代码块 234
7.1.2 函数是一类数据 234
7.1.3 函数是一种对象 234
7.2 定义JavaScript函数 235
7.2.1 克隆结构—构造函数 235
7.2.2 复杂结构的常量—函数直接量 237
7.2.3 定义嵌套函数 238
7.3 函数定义方法比较 239
7.3.1 函数作用域的比较 239
7.3.2 解析机制的比较 240
7.3.3 兼容性和灵活性比较 241
7.4 探析函数基本用法 242
7.4.1 函数返回值 242
7.4.2 调用函数 243
7.4.3 函数的生命周期 244
7.4.4 函数的作用域 245
7.5 深入函数的参数 246
7.5.1 认识函数的形参和实参 247
7.5.2 参数管理器—Arguments对象 248
7.5.3 回调函数—callee属性揭秘 249
7.5.4 Arguments对象在实践中灵活应用 250
7.6 使用函数对象 251
7.6.1 获取函数形参个数 251
7.6.2 灵敏的指针—有趣的this关键字 252
7.6.3 双刃剑—正确使用this关键字 253
7.6.4 自定义函数属性和方法 255
7.6.5 储钱罐—巧用函数的属性实现蓄能 256
7.6.6 谁的属性和方法—this与函数属性和方法的混合使用 257
7.6.7 动态调用函数—诡异的call()和apply()方法 258
7.6.8 更改指针—call()和apply()方法高级应用 260
7.7 数据寄存器—闭包函数 262
7.7.1 认识闭包 262
7.7.2 分析闭包结构的基本特性 263
1.自闭特性 263 2.包裹特性 263
7.7.3 闭包的基本应用 264
第8章 大象也有形—把握JavaScript对象 267
8.1 初识对象 267
8.1.1 什么是对象 268
8.1.2 对象是如何出生的 268
8.2 对象类型 269
8.2.1 本地对象 269
8.2.2 内置对象 270
8.2.3 宿主对象 270
8.3 对象基本操作 270
8.3.1 创建对象 271
8.3.2 引用对象 271
8.3.3 销毁对象 272
8.4 对象的属性和方法 272
8.4.1 定义对象的属性 273
8.4.2 访问对象的属性 273
8.4.3 设置和删除对象属性 274
8.4.4 对象的方法 275
8.5 对象的作用域 276
8.5.1 公共作用域 276
8.5.2 私有作用域 277
8.5.3 静态作用域 277
8.5.4 变形怪杰—作用域中的this 278
8.6 构造对象、实例对象和原型对象 279
8.6.1 构造对象 279
1.构造对象的属性 280 2.构造对象的方法 280
8.6.2 实例对象 281
1.实例对象的属性 281 2.实例对象的方法 282
8.6.3 原型对象 282
1.认识原型对象 282 2.原型属性与实例属性之间的关系 284
3.通过原型方法扩展内置对象功能 285
8.7 构造器 285
8.7.1 引用构造器—constructor属性 285
8.7.2 构造器的原型继承 286
8.7.3 根据构造器判定对象类型 287
8.8 对象基本方法和应用 287
8.8.1 对象的字符串标志—toString()方法 288
8.8.2 对象的值—valueOf()方法 289
8.8.3 检测私有属性—hasOwnProperty()方法 290
8.8.4 检测枚举属性—propertyIsEnumerable()方法 291
8.8.5 检测原型对象—isPrototypeOf()方法 293
8.9 探析JavaScript核心对象 294
8.9.1 大象无形—Global对象 294
8.9.2 数学专家—Math对象 295
8.9.3 时间管理—Date对象 298
1.获取本地系统的当前时间 298 2.通过多选参数来创建指定的
时间对象 298
3.通过一个时间格式的字符串来
创建指定的时间对象 298 4.通过传递一个毫秒数来创建
指定的时间对象 298
第9章 有序世界的信使—操作数组 301
9.1 透视数据集合 301
9.1.1 数据集合的类型 301
9.1.2 特殊数集—哈希表 302
9.2 定义数组 303
9.3 数组基本操作 304
9.3.1 存取数组元素 304
9.3.2 能够自由伸缩的数组 305
9.3.3 数组的大小 306
9.3.4 对象与数组 306
9.3.5 暗度陈仓—定义多维数组 308
9.4 数组方法及其应用 309
9.4.1 检索数组元素 309
9.4.2 添加和删除元素 309
1.push()和pop()方法 310 2.unshift()和shift()方法 310
3.模拟队列数据结构的操作 311 4.粘连数组的concat()方法 311
9.4.3 子数组操作 312
1.删除和插入元素集合—
splice()方法 312 2.截取子数组—slice()方法 313
9.4.4 数组排序 314
1.颠倒顺序—reverse()方法 314 2.数组排序—sort()方法 314
9.4.5 奇思妙想—更有趣的数组排序 315
1.根据奇偶性质排列数组 316 2.不区分大小写排序字符串 316
3.把浮点数和整数分开排列 317
9.4.6 数组与字符串相互转换 317
1.字符串通用转换—
toString()方法 317 2.本地字符串转换—
toLocalString()方法 318
3.更灵活的字符串转换—
join()方法 318 4.把字符串转换为数组—
split()方法 318
9.5 灵活使用数组及其方法扩展 319
9.5.1 神奇的数组下标 319
1.文本下标 319 2.二维数组下标 320
3.对象下标 321
9.5.2 扩展数组的基本方法 321
9.5.3 为数组扩展通用迭代器 322
9.5.4 利用数组迭代器扩展数组方法 324
1.动态改变数组中每个元素的值 324 2.过滤数组元素 325
第10章 变相怪杰—驾驭字符串 327
10.1 伤心字符串:使用值还是使用引用 327
10.1.1 思考是发现问题的钥匙 327
10.1.2 直击字符串操作的真相 328
10.1.3 字符串是如何进行比较的 330
10.2 创建字符串 330
10.2.1 定义字符串直接量 330
10.2.2 构造字符串 331
10.2.3 使用字符编码创建字符串 332
10.3 使用字符串 333
10.3.1 获取字符串的字符和字节长度 333
10.3.2 连接字符串 335
10.3.3 查找字符串 335
1.获取指定位置的字符—
charAt()和charCodeAt()方法 335 2.查找子字符串的位置—
indexOf()和lastIndexOf()方法 336
3.匹配字符串—
search()和match()方法 337
10.3.4 截取子字符串 339
1.根据长度截取子字符串—
substr()方法 339 2.根据起止下标截取子字符串—
slice()和substring()方法 339
10.3.5 编辑字符串 340
1.替换子字符串—replace()方法 340 2.字符串大小写转换 342
10.3.6 暗藏玄机—replace()方法深层技术探讨 342
10.3.7 比较字符串 344
10.3.8 把字符串转换为数组 345
10.3.9 字符串的类型和值 346
10.3.10 格式化字符串方法 347
10.4 String对象扩展及用法 348
10.4.1 模拟VBScript字符串处理函数 348
1.截取字符串左侧指定数目的字符
—left()方法 348 2.截取字符串右侧指定数目的字符
—right()方法 349
3.清除字符串首尾的空格
—trim()方法 349 4.清除字符串左侧空格
—lTrim()方法 350
5.清除字符串右侧空格
—rTrim()方法 350
10.4.2 检测特殊字符 351
10.4.3 提高字符串连接操作效率 352
10.5 字符串加密和解密 352
10.5.1 JavaScript预定义编码和解码方法 352
1.字符串常规编码和解码
—escape()和unescape()方法 353 2.URI字符串编码和解码—encodeURI()
和decodeURI()方法 353
3.URI组件编码和解码—
encodeURIComponent()和
decodeURIComponent()方法 354
10.5.2 Unicode编码 355
10.5.3 Unicode解码 355
10.5.4 自定义加密和解密方法 356
第11章 灵异的牧羊犬—使用正则表达式操纵字符串 359
11.1 第六感觉—认识正则表达式 359
11.1.1 什么是正则表达式 359
11.1.2 正则表达式的发展历史 360
11.2 定义正则表达式 361
11.2.1 使用RegExp对象构造正则表达式 361
11.2.2 定义正则表达式直接量 363
11.3 正则表达式基本语法—字符类 364
11.3.1 认识普通字符和元字符 364
11.3.2 字符直接量 364
1.用ASCII码表示 364 2.用Unicode编码表示 365
11.3.3 定义简单字符类 366
11.3.4 定义反义字符类 366
11.3.5 定义字符范围类 367
11.3.6 预定义字符类 368
11.4 正则表达式基本语法—重复类数量词 369
11.4.1 简单重复性匹配 369
11.4.2 贪婪匹配 371
1.?、{n}和{n, m}重复类 371 2.*、+和{n, }重复类 372
11.4.3 惰性匹配 372
11.4.4 支配匹配 373
11.5 高级匹配模式 374
11.5.1 分组 374
11.5.2 分组的应用价值 375
11.5.3 引用 376
11.5.4 非引用型分组 377
11.5.5 选择 378
11.5.6 声明 380
11.5.7 边界 380
11.5.8 锚记 382
11.5.9 标志 382
11.6 操作RegExp对象 383
11.6.1 实例属性 383
11.6.2 静态属性 384
11.6.3 正则表达式的方法 386
1.灵活的匹配操盘手—exec()方法 386 2.匹配验证—test()方法 387
11.6.4 比较各种模式匹配的方法 388
第4篇 直捣黄龙
第12章 BOM—探访客户的秘密 393
12.1 认识浏览器对象模型(BOM) 393
12.2 客户端全局对象—Window 395
12.2.1 全局作用域 396
12.2.2 Window对象的生命周期 396
12.2.3 人机交互—学习JavaScript第一步 397
12.2.4 控制弹出窗口 398
12.2.5 框架之间的通信 399
1.窗口不等于框架 400 2.框架之间相互访问方式 400
3.框架之间JavaScript交互 400
12.3 检测客户浏览器信息—Navigator对象 401
12.3.1 了解常用浏览器检测方法 402
1.特征检测法 402 2.字符串检测法 402
12.3.2 检测浏览器类型和版本 403
12.3.3 检测客户端操作系统 404
12.4 客户端导航—Location和History对象 405
12.4.1 全球定位仪—Location对象 405
12.4.2 浏览简史—History对象 407
1.使用JavaScript访问历史记录 407 2.使用JavaScript访问帧的历史记录 408
12.5 窗口大小控制—Screen和Window对象 408
12.5.1 屏幕大小—Screen对象 408
12.5.2 窗口大小—Window对象 409
12.6 0级文档对象模型—Document对象 410
12.6.1 认识文档对象—Document 410
12.6.2 0级文档对象模型及其读写规则 411
12.6.3 动态生成文档 412
第13章 DOM—控制文档结构的模型 415
13.1 认识DOM 415
13.1.1 DOM发展概述 415
1.DOM 0级 416 2.DOM 1级 416
3.DOM 2级 416 4.DOM 3级 417
13.1.2 检测浏览器对DOM规范支持程度 417
13.1.3 DOM核心 419
13.1.4 DOM节点 420
13.2 操作DOM文档 422
13.2.1 HTML DOM加载过程及其处理 422
13.2.2 DOM文档支持的遍历指针 424
1.childNodes 425 2.firstChild和lastChild 425
3.parentNode 425 4.nextSibling和previousSibling 426
5.documentElement 426
13.2.3 文档遍历中的空格Bug及其清除 426
13.2.4 实现一个简单的文档遍历 427
13.2.5 扩展遍历指针函数 428
1.扩展firstChild和lastChild
指针函数 429 2.扩展parentNode指针函数 429
3.扩展nextSibling和previousSibling
指针函数 429
13.2.6 通过原型继承扩展DOM元素的方法 430
13.2.7 增加文档内容 433
13.3 操作DOM节点 435
13.3.1 获取节点 435
1.使用getElementById()方法 435 2.使用getElementByTagName()方法 436
13.3.2 创建节点 437
1.创建节点的基本用法 437 2.创建DOM元素的通用方法 438
13.3.3 复制节点 439
13.3.4 插入节点 440
1.使用appendChild()方法 440 2.使用insertBefore()方法 442
13.3.5 删除节点 442
1.删除节点的基本用法 443 2.封装删除节点的方法 443
3.封装删除所有子节点的方法 444
13.3.6 替换节点 444
13.4 操作元素的属性 445
13.4.1 获取节点属性 446
13.4.2 设置节点属性 447
13.4.3 删除节点属性 448
13.4.4 存取JavaScript属性 449
13.5 操作元素的内容 449
13.5.1 获取元素包含的文本 449
13.5.2 获取元素包含的HTML信息 450
第14章 Event—JavaScript事件驱动模型 453
14.1 认识JavaScript事件 453
14.1.1 你未必理解的事件概念 453
14.1.2 事件驱动模型 454
14.1.3 事件处理和监听函数 455
14.1.4 多线程与异步回调 456
14.2 事件流及其传播 456
14.2.1 事件传播过程 457
14.2.2 冒泡型事件流 457
14.2.3 捕获型事件流 459
14.2.4 DOM标准事件流 460
14.3 DOM 0级事件模型 460
14.3.1 原始事件的处理方式 460
14.3.2 斫石取火—定义事件 461
14.3.3 直接调用—事件处理函数之趣 463
14.3.4 冷落的返回值—事件处理函数之痕 464
14.3.5 隐形的参数—事件处理函数之谜 465
14.3.6 再说this—事件处理函数之惑 466
14.3.7 身在曹营心在汉—事件处理函数之域 467
14.4 DOM 2级事件模型 469
14.4.1 认识DOM 2级事件模型 469
1.事件模块与接口 470 2.DOM 2级事件模型的工作机制 470
3.Event接口 470 4.UIEvent接口 471
5.MouseEvent接口 471 6.MutationEvent接口 471
14.4.2 绑定和销毁事件 471
1.绑定事件 472 2.销毁事件 473
14.4.3 为对象注册多个事件处理函数 473
14.4.4 兼容0级事件模型的处理方法 474
14.4.5 兼容IE的事件处理方法 475
14.5 IE事件模型 475
14.5.1 认识IE事件模型 475
14.5.2 绑定和销毁事件 476
1.绑定事件 476 2.销毁事件 476
3.事件处理函数中的this 477 4.绑定多个事件 477
14.5.3 设计可兼容的Event对象 478
14.6 事件类型 478
14.6.1 事件类型概述 479
14.6.2 鼠标事件 481
1.鼠标点击事件类型 482 2.鼠标移动事件类型 482
3.鼠标经过事件类型 484 4.鼠标来源 485
5.鼠标定位 486 6.封装并应用鼠标定位设计方案 487
7.在元素内部定位鼠标指针 488 8.鼠标按键 489
9.鼠标事件响应顺序 489
14.6.3 键盘事件 490
1.认识键盘事件的属性 490 2.ctrlKey和shiftKey属性 491
3.keyCode和charCode属性 491 4.键盘事件响应顺序 493
14.6.4 页面事件 493
1.页面初始化—load事件类型 494 2.load事件类型的特殊引用 495
3.在页面初始化之前执行脚本—
DOMContentLoaded事件类型 496 4.页面卸载—unload事件类型 498
5.更人性化的页面卸载—
beforeunload事件类型 499 6.窗口重置—resize事件类型 499
7.文档移动—scroll事件类型 500 8.错误捕获—error事件类型 500
14.6.5 UI事件 501
1.获取焦点—focus事件类型 501 2.失去焦点—blur事件类型 501
14.6.6 表单事件 501
1.选择文本—select事件类型 502 2.监测表单元素值变化—change
事件类型 502
3.提交表单—submit事件类型 503 4.重置表单—reset事件类型 504
第15章 CSS—设计HTML动态效果 507
15.1 DOM 2级样式控制模型 507
15.1.1 CSSStyleSheet接口 508
15.1.2 CSSStyleRule接口 508
15.1.3 CSSStyleDeclaration接口 509
15.2 DOM 0级样式控制模型 510
15.2.1 style对象 510
15.2.2 使用style对象读写行内样式 516
1.读取样式的属性值和属性名 516 2.设置样式的属性值 516
3.移除样式声明 517 4.检测声明中是否附加!important
关键字 517
5.内行样式设置实战 517
15.2.3 styleSheets集合 519
15.2.4 访问CSS样式表 521
15.2.5 读写CSS规则 522
15.2.6 访问最终样式 525
1.IE的最终样式 525 2.DOM的最终样式 526
15.2.7 修改CSS样式的方法比较 526
1.关于修改class样式 527 2.关于修改id样式 527
15.3 尺寸 528
15.3.1 从CSS样式表中抽取元素尺寸 528
15.3.2 把抽取的尺寸转化为实际值 529
15.3.3 使用offsetWidth和offsetHeight获取元素的尺寸 531
15.3.4 超越offsetWidth和offsetHeight的缺陷 532
15.3.5 更复杂的元素尺寸 534
15.3.6 可视区域外滚动尺寸 537
15.3.7 浏览器窗口的尺寸 538
15.4 位置 539
15.4.1 获取元素在浏览器窗口中的位置 540
15.4.2 获取元素相对父元素的位置 543
15.4.3 获取元素相对包含块的位置 543
15.4.4 设置元素的偏移位置 544
15.4.5 设置元素的相对位置 544
15.4.6 获取鼠标指针的页面位置 545
15.4.7 获取鼠标指针在元素内的位置 546
15.4.8 获取页面滚动条的位置 548
15.4.9 设置页面滚动条的位置 549
15.5 显示和隐藏 549
15.5.1 元素的可见性 550
15.5.2 显示和隐藏功能封装 550
15.5.3 设置和获取元素的透明度 551
15.6 动画 552
15.6.1 定时器 553
1.setTimeout()方法 553 2.setInterval()方法 555
3.正确选用setTimeout()和
setInterval()方法 555
15.6.2 滑动 556
15.6.3 渐隐渐显 557
第5篇 飞鸿传书
第16章 Cookie—用户信息存储、交互与安全 561
16.1 Cookie概述 561
16.1.1 Cookie回眸 561
16.1.2 Cookie信息的结构 562
16.2 存取Cookie信息 563
16.2.1 写入Cookie信息 563
16.2.2 设置Cookie有效期 563
16.2.3 设置Cookie的域和路径 564
16.2.4 设置Cookie安全传输 565
16.2.5 完善写入的Cookie信息 565
16.2.6 读取Cookie信息 566
16.2.7 修改和删除Cookie信息 567
16.2.8 Cookie的局限性及其突破 567
16.2.9 探测浏览器是否启用Cookie 569
16.3 Cookie封装与应用 569
16.3.1 Cookie封装 569
16.3.2 Cookie应用:打字测试游戏 571
第17章 XML和JSON—JavaScript数据处理模式 575
17.1 更通用的数据—XML 575
17.1.1 认识XML 575
17.1.2 XML文档结构概述 576
17.1.3 声明 577
17.1.4 处理指令 577
17.1.5 注释 578
17.1.6 标记和元素 578
17.1.7 XML属性 579
17.2 XML DOM文档对象模型 580
17.2.1 认识XML DOM文档对象模型 580
17.2.2 读取XML数据 582
17.3 IE对XML的支持 584
17.3.1 创建XML DOM对象 584
17.3.2 加载XML数据 585
1.设置加载模式 585 2.跟踪异步加载状态 585
17.3.3 数据加载错误处理 586
17.4 Mozilla对XML的支持 587
17.4.1 创建XML DOM对象 587
17.4.2 加载XML数据 588
17.4.3 读取XML数据 589
1.自定义方法模拟text属性的功能 589 2.自定义方法模拟xml属性的功能 589
17.5 XML数据导航器—XPath 590
17.5.1 XPath基本语法 590
17.5.2 IE对XPath的支持 592
17.5.3 Mozilla对XPath的支持 593
17.6 更敏捷的数据—JSON 595
17.6.1 JSON简介 595
17.6.2 深入JSON数据内核 598
1.数据的无序结构—对象 598 2.数据的有序结构—数组 598
3.数据的内容—值 599
第18章 Ajax—JavaScript通信接口与异步交互引擎 601
18.1 网络那点事儿—浓缩的HTTP 601
18.1.1 HTTP请求 602
18.1.2 HTTP响应 604
18.2 暗度陈仓—从隐藏框架说起 605
18.2.1 隐藏框架 605
18.2.2 异步交互与回调处理 608
18.2.3 使用iframe处理异步交互 611
18.3 巧连环—JSONP与跨域异步交互 613
18.3.1 小聪明大智慧—<script>标签背后的故事 613
18.3.2 动态控制script元素实现可控异步通信 615
18.3.3 script异步通信的参数传递 616
18.3.4 script异步通信的响应数据类型 620
18.3.5 JSONP异步通信协议 623
18.3.6 JSONP的安全问题 625
18.4 Ajax—更高效的异步通信接口 626
18.4.1 认识XMLHttpRequest对象 627
18.4.2 定义XMLHttpRequest对象 628
18.4.3 建立XMLHttpRequest请求连接 629
18.5 Request—发送请求 630
18.5.1 发送GET请求 630
18.5.2 发送POST请求 631
18.5.3 把数据转换为串行字符串 633
1.传输名/值对信息 633 2.传输有序数据列表 633
18.6 State—异步状态监测 634
18.6.1 跟踪Ajax异步通信状态 634
18.6.2 中止异步请求 636
18.7 Response—获取响应信息 636
18.7.1 XML 637
18.7.2 HTML 638
18.7.3 Code 639
18.7.4 JSON 640
18.7.5 Text 641
18.7.6 获取和设置头部消息 641
18.8 Ajax通信功能封装和应用 642
18.8.1 封装异步请求函数 642
18.8.2 使用Ajax改进Tab显示 643
第6篇 壮士凯旋
第19章 可视化思维—深入JavaScript面向对象编程 651
19.1 书非借不能读也—说类 651
19.1.1 类与对象 651
19.1.2 类成员:属性、方法和事件 652
19.1.3 类的基本特性:继承、封装和多态 652
19.2 定义JavaScript类 653
19.2.1 小老板为什么能年挣百万—工厂模式 653
19.2.2 拿来主义—构造函数模式 655
19.2.3 遗传栽培法—原型模式 657
19.2.4 杂交栽培法—构造函数原型模式 658
19.2.5 滴灌法—动态原型模式 660
19.3 契约书—JavaScript接口 661
19.3.1 新版黔驴技穷—大话接口 661
19.3.2 签订契约书—接口的本质 663
19.3.3 大道理简单化—JavaScript接口实现方法一 665
19.3.4 孔明点灯—JavaScript接口实现方法二 667
19.3.5 鸡肋还是鸡翅—JavaScript接口选用之惑 670
19.4 JavaScript继承机制—原型(prototype) 671
19.4.1 认识prototype 671
19.4.2 剪不断理还乱—辨析泛类、类型、原型和对象实例 672
19.4.3 形似神异—构造类的原型和本地特性 674
19.4.4 四大皆空—关于类的唯空论 676
19.4.5 原型属性的基本操作和应用技巧 678
1.利用原型为对象设置默认值 679 2.利用原型间接实现本地数据备份 680
3.利用原型设置只读属性 680 4.利用原型进行批量复制 682
19.4.6 定义静态原型方法 683
19.4.7 prototype原型域及原型链 683
19.4.8 prototype的副作用 685
19.5 JavaScript基因图谱—继承 686
19.5.1 认识JavaScript的继承机制 686
19.5.2 原型继承 688
19.5.3 类继承的源起 689
19.5.4 类继承的设计模式 690
19.5.5 深入理解类继承中call()和apply()角色 693
19.5.6 封装类继承机制 695
19.5.7 实例继承 696
19.5.8 复制继承 698
19.5.9 克隆继承 699
19.5.10 混合继承 699
19.5.11 多重继承 701
19.5.12 掺元类 702
19.6 类的封装 704
19.6.1 类的被动封装 705
19.6.2 类的主动封装 706
19.6.3 定义类的静态方法和属性 708
19.7 类的多态 710
19.7.1 方法的重载和覆盖 711
1.重载 711 2.覆盖 711
19.7.2 类的多态 712
19.8 善始善终—类的构造和析构 713
19.8.1 构造 714
19.8.2 动态构造 715
19.8.3 析构 716
19.9 类的抽象化—超类、子类和元类 717
19.9.1 超类和子类 717
19.9.2 元类 718
第20章 卜算子—深入JavaScript函数式编程 721
20.1 JavaScript函数式编程概述 721
20.1.1 函数是第一型 721
20.1.2 函数是运算元 722
20.1.3 函数是数据闭包 723
20.2 表达式运算 724
20.2.1 实现连续运算的常用方法 724
20.2.2 尝试把所有命令式语句转换为连续运算 727
20.2.3 表达式中的函数 728
20.2.4 函数的惰性与非惰性求值 730
20.2.5 函数调用栈 732
20.3 递归运算 734
20.3.1 认识递归 735
20.3.2 猜一猜,算一算—递归算法演示 736
20.3.3 递归算法 738
20.3.4 递归模型 738
1.问题的定义是递归的 738 2.问题所涉及的数据结构是递归的 739
3.问题的解法满足递归的性质 740
20.3.5 Hanoi(汉诺)塔算法 740
20.3.6 尾递归算法 742
20.3.7 Fibonacci(斐波那契)数列 744
20.3.8 递归算法的优化 746
20.4 高处不胜寒—破解函数域之惑 747
20.4.1 我是谁—JavaScript执行环境与函数解析机制 747
20.4.2 我从哪来—词法作用域与执行作用域 749
20.4.3 寻找迷失的远方—作用域链 751
20.4.4 我又在哪里—调用对象 753
20.5 天宫之旅—函数闭包 754
20.5.1 从圈外看闭包 754
20.5.2 从圈内看函数闭包 755
20.5.3 解剖闭包结构—认识闭包标识符系统 757
20.5.4 覆盖还是层叠—关于闭包函数的作用域问题 759
20.5.5 生存还是毁灭—关于闭包函数的生存周期问题 760
20.5.6 辨析函数与闭包 762
20.5.7 奇怪的不等式—函数、调用、引用和实例 763
20.5.8 梦里花落知多少—闭包函数与函数实例 765
20.5.9 剪不断理还乱—闭包函数与调用对象 769
20.5.10 保护闭包数据的独立性 771
20.5.11 始祖鸟—构造函数闭包 773
20.5.12 想你所想—函数式编程中闭包的应用价值 774
20.5.13 一起联想—函数式编程中闭包的桥梁作用 776
20.5.14 预防中毒—闭包的副作用 779
20.6 我是谁?—彻底研究this 782
20.6.1 who is this—确认this的身份 783
1.this代表当前对象 783 2.this代表当前作用域对象 784
20.6.2 what is this—this的本质 786
1.闭包的破坏性 787 2.call()和apply()方法的破坏性 788
3.异步调用的破坏性 788
20.6.3 where is this—在哪儿使用this 788
1.函数的引用和调用 788 2.call()和apply() 789
3.原型继承 790 4.异步调用之事件处理函数 791
5.异步调用之定时器 792
20.6.4 how to do this—this应对策略 792
1.预防this多变的基本原则 792 2.把this作为参数值 793
3.设计静态的this指针 793 4.设计静态的this扩展方法 794
第21章 流水不腐—深入JavaScript动态化编程 797
21.1 使用eval()方法动态执行语句 797
21.1.1 动态值、表达式和语句 797 21.1.2 对象和函数直接量的歧义问题 799
21.1.3 eval全局执行域及其兼容方法 800 21.1.4 eval当前执行域 802
21.2 动态调用函数 802
21.2.1 函数调用方法及执行效率比较 802
1.使用小括号运算符调用函数 803 2.使用new运算符调用函数 803
3.使用call()和apply()方法调用函数 804 4.使用定时器调用函数 804
5.使用事件处理函数调用函数 805
21.2.2 函数的调用对象 805
21.2.3 动态调用中的this指针 808
21.2.4 在动态调用中实现继承 810
21.2.5 动态调用中易迷失的this指针 810
21.2.6 嵌套函数调用中的副作用 812
21.3 动态重写 814
21.3.1 重写原型对象 814
21.3.2 重写构造器 816
21.3.3 重写方法 818
前言:
前言
JavaScript是目前流行的一门语言,在2009年3月Tiobe编程语言排行榜中位居第8位。作为一种轻型的、解释型的程序设计语言,虽然很多服务器端技术(如ASP)都支持JavaScript,但是JavaScript主要应用于Web前台开发,它以脚本的形式嵌入到网页文档内,由客户端浏览器负责解析和执行。
Web 2.0和Ajax概念的诞生,加快了JavaScript技术的成熟。目前,JavaScript技术被广泛应用于各种B/S架构的项目和不同类型的网站中。如果你是JavaScript语言初学者,或者是使用过JavaScript技术的熟手,甚至是精通JavaScript应用的高手,相信在阅读完本书之后,你会发现:JavaScript用法原来这么灵活,JavaScript技术原来如此深奥,JavaScript编程真的很有趣。
关于本书
JavaScript语言最近几年发展速度比较快,有关JavaScript语言的技术图书也是汗牛充栋。当然,书总是越写越深入,越写越通俗。在仔细分析当前JavaScript图书存在的问题,并征求广大读者的意见之后,我萌生了另眼写作JavaScript的冲动。
JavaScript的优势在于灵活,而不是庞杂,同时它也是少数几种能够兼顾函数式编程和面向对象编程的语言,要全面认识JavaScript的语言特性,完全驾驭JavaScript技术,就应该有一本好的技术参考图书,本书的定位正是基于此,而不是简单的重复。
如果你因为难以消化外版图书的艰涩和枯燥,如果你因为被众多技术图书偏失所困惑,越读越糊涂,那么建议你试读本书。本书绝对让你读起来上瘾,读起来有意思,读得透悟和深入。
寓情喻理,润物无声
本书最大的优点就是秉承作者一贯的写作风格,声情并茂,寓情喻理,注重读者情商和智商的潜移默化。例如,在讲解JavaScript类时,从黄生借书说这个典故开始,娓娓道来,然后又以李博士的幽默人生切入定义类的方法。读者在细读中,不知不觉中掌握技术的真谛。在讲解函数时,从魔术盒入笔,在生动的比较中,发现函数的内涵,而不是直白、被动地接受技术。通过风沙缠绵,分析数据与运算的内在关系,由高考语法试题分析语句中的逻辑关系,如此等等,读者在生动的故事、浓郁的描述中不知不觉理解各种抽象的概念,明白其中的道理。
在故事中孕育道理
技术图书好像很少讲故事,技术图书的作者习惯于“板起面孔”说道理,而本书贯穿大量的故事,小故事可能三言两语,大故事也可能一段两段,高手可能会感觉有点啰嗦,但是对于广大初学者或进阶者来说,绝对能够帮助你轻松阅读、快速消化。例如,在讲解JavaScript接口时,穿插新编黔驴技穷的故事、诸葛孔明与好事之徒对白,把深奥的道理通俗化、趣味化。从陆游的卜算子入笔,逐步深入探析函数式编程,读起来很亲切、有趣味。在讲解递归运算时,从老和尚讲故事开始,再通过游戏进行生动讲解等。
抽象道理生活化
类和对象很抽象,但是如果使用归类法和演绎法把这些道理生活化,你会感觉非常有趣,而不是枯燥难耐。对于原型继承,则从最基本、最简单的数据类型开始,从易被人遗忘的知识中不断推演出抽象的道理。讲到函数式编程,先从编程的历史和分类开始,纲举目张。
知其然,知其所以然
书不能够简单作为知识的传声筒,还应该成为放大器。让读者知其然,还要让读者知其所以然,本书在每章中都能够渗透大量的外延性知识和技术,真正让读者举一反三,彻底明白JavaScript技术的内涵和外延。例如,在讲解Ajax技术时,从HTTP本质探析开始,再从异步交互技术的发展历史娓娓道来,让读者读起来很明白,不仅会用,还会应变。在讲解递归运算时,不追求如何解递归方程,而探析与递归运算相关的技术应用,让读者真正学有所用,学得实在。在讲解数据和数据类型时,从物质的本原开始,从计算机的硬件支持剖析,真正让读者明白其中的道理,以及道理背后的故事,另外还有字符串的数据类型、数组本质、动态化编程等。
挖井的道理
读书或写书都存在这样的陋习:浅尝辄止,不注重深挖。这对于读者来说,很容易产生夹生饭。本书注意到这个问题,不管讲解什么内容,总是深挖,直到挖出井水来。特别是JavaScript重点、难点知识更是如此。例如,在讲解原型继承时,本书使用了近30多页来挖掘其所有内涵,使用了近40页由浅入深详细讲解函数闭包的应用,使用近20页讲解this关键字等。对于类的拓展,分别讲解了类的封装、构造、析构、多态、抽象等。对于XMLHttpRequest技术,本书不仅仅讲解其用法,还系统讲解不同类型数据的异步处理、不同请求方式的处理、状态跟踪,以及代码封装,让读者很快把握XMLHttpRequest技术的内涵。在讲解函数作用域、作用域链、调用对象等比较生涩的技术概念时,从简单的生活故事开始,逐步深入,慢慢化解。
用示例演示道理,用代码指点迷津
本书提供了大量的示例,基本每讲解一个道理、一个知识点或一项应用时,都要以示例进行演示,目的是帮助读者快速掌握这些技术。当然,为了节省篇幅,所举代码都是极尽精练,并富有代表性,这样就可以节省大量篇幅,为读者节省开支,同时避免读者迷失于大段的代码中而不能够自拔。
经典与思想的对决
本书渗透了大量的编程思想,如函数式编程、面向对象编程等,还包括很多经典的算法,如汉诺塔、斐波那契数列、杨辉三角等。
深入探析面向对象和函数式编程
为了避免偏失,本书不仅系统讲解JavaScript语言核心,同时深刻讲解JavaScript函数式编程、面向对象编程。另外,还就客户端应用开发进行全面剖析,如事件处理、动画设计、浏览器控制、数据交互等。
兼容主流浏览器
本书示例完全兼顾IE、Firefox、Opera等主流浏览器,同时还就各种客户端开发中的兼容问题进行详细讲解,特别是事件驱动模型、CSS动画设计、BOM浏览器对象处理、异步通信技术和XML数据处理等实用技术,但是它们都存在不兼容性问题。
为什么推荐本书
本书获得了计算机技术专业师生的首肯,并推荐选用,其优势可以简单概括为系统、深入和浅出。
系统
系统性是广大初学者要完全认识和掌握一门语言的基础,它体现在技术知识、语言结构的有序、完整和严谨性上。很多读者由于没有注意到这个问题,随意选择一本JavaScript技术图书,也就形成个人对于JavaScript技术的片面认识,不能够很好地发挥JavaScript语言的潜能。本书不仅关注JavaScript语言词法、语法体系的完整性,同时系统讲解JavaScript核心特性,以及JavaScript的重要应用。
深入
深入不是艰涩,本书尽力克服内容的枯燥和艰涩,对于一些核心且会影响读者对于问题理解的关键概念总是穷追不舍、刨根溯源,如字符串的计算方式、数据和数据类型、函数闭包、函数的this指针、类和继承等。
浅出
本书以通俗、生动的语言描述了各种“冰冷”的技术话题和概念应用,同时在详尽的描述中,对于重点、难点技术和知识点,总会不厌其烦地进行旁征博引。语言主要是以轻松、愉悦的描述和比喻为主,避免机械式说明。这种描述语言有时候会稍显啰嗦,但是对于读者理解和铭记一些重点、难点概念和知识是必要的。换句话说,好的图书应该是营养和吸收同步,否则再好的山珍、熊掌对于无法消化的胃口来说都是一个负担。
读者对象
本书是一部零起步,系统、深入浅出的JavaScript技术图书,特别适合以下3类读者群。
希望系统、深入学习JavaScript语言的初学者
零起步并不是说一无所知,读者应初步掌握HTML、CSS操作和应用,了解Web开发的一般方法和简单操作过程。本书专门为那些系统学习JavaScript的读者量身打造,系统、深入和浅出是本书的最大特点。
希望提高Web站点的可用性的Web应用程序开发人员
JavaScript语言非常特殊,它能够在众多强手中跻身全球十大语言之一,肯定有其内在原因。特别是很多使用传统语言的开发人员,当初次选用JavaScript时,也迫切需要一本能够揭示JavaScript语言特色和核心技术的图书。本书能够帮助这些开发人员很轻松地过渡到JavaScript开发环境中。同时,本书也是很多后台开发人员的参考图书,因为随着JavaScript技术的不断增强,前、后台技术的界限日益模糊,如何同时兼顾前、后台技术开发,是广大后台程序员必须认真思考的问题。
希望提升JavaScript的OOP和函数式编程的进阶人员
很多熟悉面向对象程序设计方法的开发人员,他们已经掌握了JavaScript语言的基本用法,并拥有了很多实践经验,但是由于JavaScript与OO语言紧密联系,希望学习JavaScript面向对象编程的思想和风格,并对JavaScript函数式编程怀有好奇的想法,所以想学习它。
此外,本书也适合需要掌握以下技术的读者:
CSS
XML
JSON
XPath
Ajax
BOM
DOM
本书的结构
第1章 与初学者谈谈JavaScript学习
本章从几个简单的概念说起,探析了JavaScript语言的基本特性,介绍JavaScript语言发展历史、派系,以及与客户端、浏览器之间的关系;此外,还专题讨论了JavaScript运行环境、JavaScript解析机制、JavaScript执行顺序、JavaScript应用范围和JavaScript开发工具。
第2章 Hello,World —JavaScript开发初体验
本章主要结合杨辉三角这个经典的编程案例,以具体、可操作的实例为载体,引导读者如何一步步动手编写JavaScript代码,如何把JavaScript脚本与HTML源代码分离并捆绑在一起;另外,还专题讨论了JavaScript编码习惯和JavaScript程序调试问题。
第3章 运筹帷幄—俯瞰JavaScript语法体系
本章主要从语法逻辑的角度俯瞰JavaScript语言体系结构,认识语言的本质,以及基本结构规律。借此希望读者在深入阅读本书之前,能够对于JavaScript语言有一个总的认识,这样就避免了在具体的语言学习中迷失方向。
第4章 JavaScript血液系统—数据、数据类型和变量
本章深入到概念的背后,探析数据的本质,分析数据类型的物理要素,以及变量的各种特殊应用和注意事项;同时,详细分析在JavaScript语言中数据的体现,数据类型的分、合、转、引等核心问题;对null、undefined、对象、函数等特殊或复杂类型数据进行深入讲解,并就数据转换中各种特殊应用进行说明。
第5章 JavaScript肌肉系统—运算符、表达式
本章系统讲解了JavaScript词法基础,包括运算符和表达式的基础知识和应用。特别是对于位运算符、逻辑运算符、关系运算符等复杂的运算符进行深入挖掘;另外,还系统探析了赋值运算符、new运算符、delete运算符,以及其他运算符的使用。
第6章 JavaScript神经骨骼系统—语句、结构
本章系统讲解了JavaScript句法基础,包括各种语句和逻辑结构的基础知识和应用,辨析词、表达式和语句之间的关系和区别;另外,还详细分析了不同结构体的特殊性及其应用价值。
第7章 盒子里的魔术—透视JavaScript函数
本章讲解了函数的基本特性和结构,函数定义和用法,形参和实参的应用,以及函数对象所拥有的基本属性;对函数应用中的几个特殊概念进行深入分析,如this指针、闭包函数等。当然,作为函数式编程语言,在后面章节中,本书还将揭示更深奥的函数应用。
第8章 大象亦有形—把握JavaScript对象
本章详细介绍了对象的类型、基本操作,以及对象的属性和方法,对象的作用域,以及Object对象的基本方法和应用;另外,还就构造对象、实例对象、原型对象和构造器进行比较分析;最后,介绍了JavaScript预定义的核心对象使用。
第9章 有序世界的信使—操作数组
本章重点讲解JavaScript数组的使用,首先从数据集合的角度探析数组的结构;然后介绍数组定义及其基本操作方法,并系统讲解数组对象的方法及其应用、灵活使用数组及其方法扩展。
第10章 变相怪杰—驾驭字符串
字符串似乎比较简单,但是要了解字符串数据类型的本质,以及熟悉驾驭字符串不是件容易的事情,本章重点探析字符串作为一类特殊的数据,在JavaScript中容易被误解的问题,并分门别类地讨论了字符串操作的各种方法和用法。
第11章 灵异的牧羊犬—使用正则表达式操纵字符串
正则表达式无疑是一个比较强大的工具,使用它进行数据验证和字符串操作非常敏捷,但是要驾驭它,需要读者认识JavaScript语言对于正则表达式的支持和特性。本章重点讲解了JavaScript中正则表达式对象的构造、方法和使用,同时还探析了正则表达式的基本语法,以及各种匹配模式的形式和使用规律。
第12章 BOM —探访客户的秘密
本章重点介绍了客户端浏览器的BOM概念,并介绍了客户端全局对象的基本规律和使用方法,以及如何检测客户浏览器信息,如何控制客户端的行为,如何设置客户端浏览器的大小和位置等基本属性。
第13章 DOM—控制文档结构的模型
本章介绍了在JavaScript中实现的DOM,包括专门适用于Web开发者的DOM概念,以及如何使用DOM控制HTML结构和属性等应用技术;此外,还讨论了如何实现跨浏览器的支持。
第14章 Event—JavaScript事件驱动模型
本章介绍了事件处理的各种方法和事件流的概念(包括冒泡和捕获),并详细讲解了IE支持的事件驱动模型和DOM标准事件模型之间的区别和兼容方法;最后,分类讲解了不同事件类型的应用。
第15章 CSS —设计动态HTML的效果
本章讲解了CSS脚本化应用,以及不同浏览器之间的兼容方法;分析了DOM 0级和2级模块中CSS技术的实现;最后,结合元素尺寸、定位,以及动画设计,深入讲解Web开发中几个重点技术话题。
第16章 Cookie—用户信息存储、交互与安全
本章介绍了客户端Cookie技术实现,以及具体封装的方法。Cookie技术是客户端浏览器中用来临时存储用户信息的一种方法,并实现客户端与服务器端异步通信。该技术在Web开发中的应用比较广泛,特别是服务器端技术对其支持比较强大,当然JavaScript也提供了比较丰富的技术支持。
第17章 XML和JSON—JavaScript数据处理模式
XML和JSON是Web开发中最受欢迎的两种数据格式。XML应用广泛,但是兼容性比较差,目前仅有IE和Firefox浏览器支持XML数据的JavaScript读写,Opera 9.5版本浏览器也开始支持DOM XML模块。JSON格式数据完全符合JavaScript语法规则,可以作为JavaScript脚本代码,能够很好地与JavaScript融合,是最轻便的一种数据格式。本章讲解了JavaScript用于读取和操作XML(可扩展标记语言)数据的特性,解释了各种Web浏览器中的支持和对象的不同,还为跨浏览器编码提供了建议;此外,本章还介绍了如何使用XPath语言查询XML数据。
第18章 Ajax—JavaScript通信接口与异步交互引擎
本章重点讲解如何使用JavaScript实现客户端与服务器HTTP异步通信;详细介绍了HTTP数据结构,以及实现异步通信的各种方法;最后深入讨论了XMLHttpRequest组件的使用。
第19章 可视化思维 —深入JavaScript面向对象编程
本章重点讲解了使用JavaScript进行面向对象的程序设计(OOP)的基础,探析JavaScript实现继承机制的工作机理,其中讨论了各种实现继承的方法;对类、接口和超类等抽象的技术话题也展开详细讨论。
第20章 卜算子—深入JavaScript函数式编程
本章针对JavaScript函数式编程进行深入讨论,其中重点探析了表达式运算的一般方法和技巧,对函数作用域、函数闭包等重、难点技术进行系统剖析;最后,还就JavaScript中非常灵活的this用法进行讨论。
第21章 流水不腐—深入JavaScript动态化编程
本章重点讲解JavaScript动态脚本特性,讨论了eval()方法、动态函数调用,以及动态重写等话题。
如何使用本书
对于JavaScript技术来说,学习和实践一般不需要复杂的环境配置和辅助工具,读者只需要安装Web浏览器和文本编辑器即可。但是,要更有效地学习和实践,建议读者阅读1.8节内容。同时,运行本书中的示例,需要下列软件:
Windows 2000、Windows Server 2003、Windows XP、Windows Vista或Mac OS X
IE 5.5或更高版本
Mozilla 1.0或更高版本
Opera 7.5或更高版本
Safari 1.2或更高版本
具体工具说明请参阅1.3.4节、1.4节和1.8节说明。
读者可以从作者个人网站(http://www.css8.cn/)或飞思在线(http://www.fecit.com.cn/的“下载专区”)的本书配套网页下载书中示例的完整源代码。
为了节省版面,本书所显示的示例代码都是局部的,读者需要在网页中输入<script>标签,并尝试把书中列举的JavaScript脚本代码输入,然后在Web浏览器中试验,以验证代码运行效果。针对第16章到第18章的部分示例可能需要服务器端的配合,读者可以参阅示例所在章节的说明进行操作即可。
联系作者
读者如果有任何问题、意见和想法,都可以随时与作者联系,作者的电子邮件地址是zhuyinhong@css8.cn,也可以经常浏览一下作者网站http://www.css8.cn/,了解一些更新的内容和勘误信息,以便与作者或其他读者进行交流和讨论。
朱印宏