编辑推荐

  

世JavaScript之父BrendanEich高度评价并强力推荐

JavaScript编程原理与运用规则完美融合,读者将在游戏式开发中学会JavaScript程序设计,是系统学习JavaScript程序设计的作品


  

JavaScript几乎可以说是所有现代Web应用程序的核心,无论是社交应用程序,还是时下流行的浏览器游戏。虽说学习和使用JavaScript的成本并不高,但是它却是一种灵活且复杂的编程语言,你可以用它来构建功能全面且复杂的应用程序。
  
  《JavaScript编程精解(原书第2版)》深入剖析了JavaScript编程语言的内部细节,并阐述了编写优雅高效代码的方法。作者MarijnHaverbeke从示例代码开始讲解,逐步实现了完整的项目,与此同时作者还提供了一系列习题供读者练习,你可以从中学习并了解如何编写自己的程序。
  
  通过阅读《JavaScript编程精解(原书第2版)》,你将学习和了解到:
  编程的基本要素,这其中包括语法、控制流和数据。
  如何组织和创建面向对象的代码以及函数式编程的技术。
  如何在浏览器当中编写脚本和创建基本Web应用程序。
  如何使用DOM与浏览器进行高效交互。
  如何通过Node.js来构建服务器和工具。
  
  《JavaScript编程精解(原书第2版)》的第2版经过全面的更新和修订,覆盖了JavaScript的绝大多数语言特性,涉及Web编程和Node.js服务器编程,以及JavaScript性能优化等。《JavaScript编程精解(原书第2版)》的在线网站提供了所有源代码,你可以通过在线沙箱来编辑、运行代码,并实时查看输出结果。

内容简介

  

  JavaScript是一门流行的程序设计语言,在这个Web的时代中,其地位已经变得越来越举足轻重。《JavaScript编程精解(原书第2版)》从JavaScript的基本语言特性入手,详细讲解JavaScript的语法,并通过一些实例,讲解使用其解决实际问题的方法与思路。同时又结合网页开发与Node.js讲解JavaScript在Web前端开发与服务端开发中的作用,可以为读者快速学习掌握JavaScript提供系统指导。

??

  《JavaScript编程精解(原书第2版)》共分为三个部分。第一部分主要讨论JavaScript的语言特性。第1~4章介绍JavaScript语言的基本结构,包括控制结构、函数和数据结构。第5~6章深入探讨函数与对象,并介绍如何控制代码复杂度。第7章是实例项目,介绍如何使用基本的JavaScript语法解决实际问题。第8章介绍如何处理错误,第9章介绍正则表达式与JavaScript中正则表达式的用法。第10章介绍如何在JavaScript中构建使用模块。第11章作为第一部分的结尾,介绍如何设计并构建一个程序语言解析器。第二部分主要讲解如何在浏览器中运用JavaScript。第12章介绍JavaScript与浏览器的历史与关系。第13章介绍了浏览器的DOM模型。第14章介绍如何使用JavaScript处理DOM事件。第15章介绍如何通过操纵DOM来编写一个浏览器中的2D游戏。第16章介绍HTML5中的画布,并介绍如何使用JavaScript绘图。第17章介绍HTTP协议,以及如何使用JavaScript进行网络通信。第18章介绍表单与其使用方法。第19章是另一个实例项目,介绍如何开发一个基于HTML的绘图程序,是对第二部分的总结。第三部分是提高部分。第20章介绍如何使用Node.js开发Web服务,体现出JavaScript的强大威力。第21章介绍如何使用JavaScript完成一个完整的Web应用。最后一章则介绍提升JavaScript性能的一些基本原则与方法,并给出一些实例。

作者简介

  作者简介

  马尔奇·哈弗贝克(MarijnHaverbeke),

  JavaScript程序员,通晓多种编程语言,在Web开发方面积累了丰富的经验,在JavaScript领域颇有影响力。此外,他创建并维护着多个流行的开源项目,如CodeMirror编辑器和Tern类型推导引擎等。


  译者简介

  卢誉声,软件工程师,擅长C++多线程编程和实时分布式系统架构。曾在思科系统(中国)研发中心云产品研发部工作多年。他曾参与服务器后端、前端以及SDK的设计与研发工作,在大规模分布式系统设计与实现、性能调优、高可用性和自动化等方面积累了丰富的敏捷实践与开发经验。现在在美国某IT/互联网公司工作,从事C++底层通信系统设计与研发。此外,他从事C/C++研发工作,对Java、JavaScript、Lua以及移动开发平台等也有一定研究。

目录

译者序
赞誉
前言
第一部分 JavaScript编程语言
第1章 值、类型和运算符2
1.1 值2
1.2 数字3
1.3 字符串5
1.4 一元运算符6
1.5 布尔值6
1.6 未定义值8
1.7 自动类型转换8
1.8 本章小结10
第2章 程序结构11
2.1 表达式和语句11
2.2 变量12
2.3 关键字和保留字13
2.4 环境14
2.5 函数14
2.6 console.log函数14
2.7 返回值15
2.8 prompt和confirm函数15
2.9 控制流16
2.10 条件执行16
2.11 while和do循环17
2.12 代码缩进19
2.13 for循环19
2.14 跳出循环20
2.15 更新变量的简便方法21
2.16 switch条件分支21
2.17 大写22
2.18 注释22
2.19 本章小结23
2.20 习题23
第3章 函数25
3.1 定义函数25
3.2 参数和作用域26
3.3 嵌套作用域27
3.4 函数值28
3.5 符号声明29
3.6 调用栈29
3.7 可选参数31
3.8 闭包31
3.9 递归32
3.10 添加新函数35
3.11 函数及其副作用37
3.12 本章小结37
3.13 习题38
第4章 数据结构:对象和数组39
4.1 松鼠人39
4.2 数据集40
4.3 属性41
4.4 方法41
4.5 对象42
4.6 可变性44
4.7 松鼠人的记录45
4.8 计算关联性47
4.9 对象映射48
4.10 分析结果49
4.11 详解数组50
4.12 字符串及其属性51
4.13 arguments对象52
4.14 Math对象53
4.15 全局对象55
4.16 本章小结55
4.17 习题55
第5章 高阶函数58
5.1 抽象59
5.2 数组遍历抽象59
5.3 高阶函数61
5.4 参数传递62
5.5 JSON63
5.6 数组过滤64
5.7 使用map函数转换数组65
5.8 使用reduce进行数据汇总65
5.9 可组合性66
5.10 性能开销67
5.11 曾曾曾曾……祖父67
5.12 绑定70
5.13 本章小结70
5.14 习题71
第6章 深入理解对象72
6.1 历史72
6.2 方法73
6.3 原型74
6.4 构造函数75
6.5 覆盖继承的属性76
6.6 原型污染77
6.7 无原型对象79
6.8 多态79
6.9 绘制表格80
6.10 Getter与Setter84
6.11 继承85
6.12 instanceof运算符87
6.13 本章小结87
6.14 习题88
第7章 项目实战:构建电子生态
 系统89
7.1 定义89
7.2 描述世界90
7.3 动物的编程接口91
7.4 World对象93
7.5 this及其作用域94
7.6 赋予生命96
7.7 动物的爬行动作98
7.8 更多动物98
7.9 更逼真的生态系统仿真99
7.10 动作处理器100
7.11 充实这个新世界102
7.12 让虚拟世界生机盎然103
7.13 习题104
第8章 处理缺陷与错误105
8.1 开发人员造成的问题105
8.2 严格模式106
8.3 测试107
8.4 调试108
8.5 错误传播109
8.6 异常110
8.7 异常后清理111
8.8 选择性捕获112
8.9 断言114
8.10 本章小结115
8.11 习题115
第9章 正则表达式116
9.1 创建正则表达式116
9.2 匹配测试117
9.3 匹配字符集117
9.4 部分模式重复118
9.5 子表达式分组119
9.6 匹配和分组119
9.7 日期类型120
9.8 单词和字符串边界121
9.9 选项模式122
9.10 匹配原理122
9.11 回溯123
9.12 replace方法125
9.13 贪婪模式126
9.14 动态创建RegExp对象127
9.15 search方法128
9.16 lastIndex属性128
9.17 解析INI文件129
9.18 国际化字符131
9.19 本章小结131
9.20 习题132
第10章 模块134
10.1 模块的好处134
10.2 使用函数作为命名空间136
10.3 使用对象作为接口137
10.4 与全局作用域分离138
10.5 将数据作为代码执行138
10.6 require函数139
10.7 模块加载过慢的问题140
10.8 接口设计143
10.9 本章小结144
10.10 习题145
第11章 项目实战:开发编程语言147
11.1 解析147
11.2 代码执行器150
11.3 特殊形式151
11.4 环境153
11.5 函数154
11.6 编译155
11.7 站在别人的肩膀上155
11.8 习题156
第二部分 在浏览器中使用JavaScript
第12章 浏览器中的JavaScript160
12.1 网络和Internet160
12.2 Web161
12.3 HTML162
12.4 HTML和JavaScript164
12.5 沙箱164
12.6 兼容性与浏览器之争165
第13章 文档对象模型166
13.1 文档结构166
13.2 树167
13.3 标准168
13.4 通过树结构访问节点169
13.5 查找元素170
13.6 修改文档170
13.7 创建节点171
13.8 属性173
13.9 布局175
13.10 样式176
13.11 层叠样式177
13.12 查询选择器178
13.13 位置与动画179
13.14 本章小结181
13.15 习题181
第14章 处理事件183
14.1 事件处理器183
14.2 事件与DOM节点184
14.3 事件对象184
14.4 传播185
14.5 默认动作186
14.6 按键事件187
14.7 鼠标点击188
14.8 鼠标移动189
14.9 滚动事件191
14.10 焦点事件192
14.11 加载事件192
14.12 脚本执行时间线193
14.13 设置定时器193
14.14 降频194
14.15 本章小结195
14.16 习题196
第15章 项目实战:平台游戏198
15.1 游戏198
15.2 实现技术199
15.3 关卡199
15.4 读取关卡200
15.5 活动元素201
15.6 当封装成为负担203
15.7 绘图204
15.8 动作与冲突208
15.9 活动元素与动作209
15.10 跟踪按键213
15.11 运行游戏213
15.12 习题215
第16章 使用canvas绘图217
16.1 SVG217
16.2 canvas元素218
16.3 填充与描边219
16.4 路径220
16.5 曲线221
16.6 绘制饼状图224
16.7 文本225
16.8 图像225
16.9 变换227
16.10 存储与清除图像的变换状态228
16.11 回到游戏230
16.12 选择图像接口234
16.13 本章小结235
16.14 习题235
第17章 HTTP协议概述237
17.1 协议简介237
17.2 浏览器和HTTP238
17.3 XMLHttpRequest240
17.4 发送请求240
17.5 异步请求241
17.6 获取XML数据242
17.7 HTTP沙箱242
17.8 抽象请求243
17.9 Promise245
17.10 运用HTTP247
17.11 安全和HTTPS247
17.12 本章小结248
17.13 习题248
第18章 表单和表单域250
18.1 域250
18.2 聚焦252
18.3 禁用域252
18.4 作为整体的表单253
18.5 文本域254
18.6 选择框和单选框255
18.7 选择域256
18.8 文件域257
18.9 客户端保存数据259
18.10 本章小结261
18.11 习题261
第19章 项目实战:绘图程序263
19.1 实现263
19.2 建立DOM264
19.3 基础265
19.4 工具选择265
19.5 颜色和画刷大小267
19.6 保存269
19.7 加载图片文件270
19.8 完成271
19.9 习题272
第三部分 高级主题
第20章 Node.js276
20.1 背景276
20.2 异步性277
20.3 node命令278
20.4 模块278
20.5 使用NPM安装279
20.6 文件系统模块281
20.7 HTTP模块282
20.8 流283
20.9 简单的文件服务器284
20.10 错误处理288
20.11 本章小结290
20.12 习题290
第21章 项目实战:技能分享网站293
21.1 设计293
21.2 长轮询294
21.3 HTTP接口295
21.4 服务器297
21.5 客户端303
21.6 习题309
第22章 JavaScript和性能311
22.1 分阶段编译311
22.2 图形布局312
22.3 定义图313
22.4 第一个力导向布局函数314
22.5 性能分析316
22.6 函数内联317
22.7 退化回旧式循环318
22.8 避免工作319
22.9 产生更少的垃圾319
22.10 垃圾回收320
22.11 修改对象321
22.12 动态类型322
22.13 本章小结323
22.14 习题324

前言/序言

  《JavaScript编程精解(原书第2版)》讲解如何通过编程来让计算机执行任务。时至今日,计算机就像螺丝刀一样随处可见,但相比于螺丝刀而言,计算机中包含了更多隐含的复杂性,因此也更加难以理解和操作。许多人仍对计算机感到陌生和恐惧。  一边是有血有肉的具备社交才能和空间推理能力的人类,另一边是冰冷的处理二进制数据的计算机,这两者该如何进行交互呢?我们已经找到了两种高效的方式来搭建人类与计算机之间通信的桥梁。种方法是模拟现实世界来构建与计算机交互的接口,这样我们就可以动动手指来操作计算机屏幕上的图形。对于一般的机器交互来说,这种方式非常实用。  但是,我们在使用这种方法的情况下,只能通过点击操作实现接口设计者预先定义好的功能。幸运的是,我们可以利用人类的语言天赋来教会计算机一门语言,实现开放式接口。比如指挥计算机执行任意一种任务。  人类语言可以用多种方式来组合单词和短语,表述出不同的信息。虽然计算机语言的语法灵活性没那么高,但也是采用了类似的原则进行设计的。  在过去的20年中,越来越多的人开始使用计算机来进行简易的运算,曾经作为默认人机交互方式的命令行接口,现如今已经被图形界面所取代。但只要你细心观察,就会发现基于语言的接口仍在那里。比如JavaScript语言,你几乎可以在每个网页浏览器中找到它的身影,而消费者的设备都可以执行这门语言。  《JavaScript编程精解(原书第2版)》的主要内容就是介绍这门语言,在阅读完《JavaScript编程精解(原书第2版)》后,相信你可以通过该语言来对计算机编程。  关于程序设计不愤不启,不悱不发,举一隅不以三隅反,则不复也。  —孔子除了讲解JavaScript之外,《JavaScript编程精解(原书第2版)》也会介绍一些程序设计的基本原则。程序设计还是比较复杂的。编程的基本规则通常简单清晰,但在这些基本规则之上构建的程序却容易变得复杂,导致程序产生了自己的规则和复杂性。即便程序是按照你自己的思路去构建的,你也有可能迷失在代码之间。  在阅读《JavaScript编程精解(原书第2版)》时,你有可能会觉得书中的概念难以理解。如果你刚刚开始学习编程,那么你估计还有不少东西需要掌握呢。如果你想将所学知识融会贯通,那么就需要去多参考和学习一些资料。  是否付出必要的努力完全取决于你自己。当你阅读《JavaScript编程精解(原书第2版)》的时候发现任何难点,千万不要轻易就对自己的能力下结论。只要能坚持下去,你就是好样的。稍做休息,复习一下所学的知识点,确保自己阅读并理解了示例程序和相关的练习。学习是一项艰巨的任务,但你掌握的所有知识都属于你自己,而且今后的学习道路会愈加轻松。  计算机程序员对其创造的宇宙负全部责任,因为他们是创造者。以计算机程序的形式,可创造出无限复杂的宇宙。  —约瑟夫·魏泽鲍姆《计算机的威力与人类的理性》一个程序有很多含义:它是开发人员编写的一段文本、计算机执行的一段指令集合、计算机内存当中的数据以及控制内存中数据的操作集合。我们通常很难将程序与我们日常生活中熟悉的事物进行对比。有一种表面上比较恰当的比喻,即将程序视作包含许多组件的机器,为了让机器正常工作,这些组件通过内部通信来实现整个机器的正常运转。  计算机正是运行这些非物质机器的载体。计算机本身并不能实现多么复杂的功能,但计算机之所以有用是因为它们的运算速度非常快。而程序的作用就是将这些看似简单的动作组合起来,然后实现复杂的功能。  对于我们当中的某些人来说,编写计算机程序是一种极大的乐趣。程序是开发人员思想的结晶。编写程序不需要什么物质投入,它很轻量级,通过我们的双手创造。  但如果不稍加注意,程序的体积和复杂度就会失去控制,甚至代码的编写者也会感到迷惑。在可控的范围内编写程序是编程过程中首要解决的问题。当程序运行时,一切都是那么美好。编程的精粹就在于如何更好地控制复杂度。质量高的程序的复杂度都不会太高。  很多开发人员认为,控制程序复杂度的好方法就是避免使用不熟悉的技术。他们制定了严格的规则(“佳实践”),定义了程序应该编写成什么样子。而激进分子更是觉得,如果程序没有按照这些规则进行编写,那么编写这些程序的开发人员就是不合格的。  这极大地降低了程序的丰富程度!将程序简化成一些直截了当的代码,并完全禁止人们编写丰富多样的程序。正是因为程序当中有那么多不同的思想和未经探索的领域,才使得编程技术如此令人着迷。诚然,程序设计的世界中充满各色陷阱,让一个缺乏经验的程序员陷入其中非常危险,但这也只是意味着在前行过程中你需要小心谨慎,时刻保证头脑清醒,毕竟我们还要面对许多新挑战,探索更多新的领域。而那些不愿探索的人只会停滞不前,淡忘编程的乐趣,厌倦自己的事业。  为什么编程语言如此重要在计算技术发展伊始,并没有编程语言这个概念。程序看起来就像这样:  该程序计算数字1~10之和,并打印出结果:1+2+…+10=55。该程序可以运行在一个简单的机器上。在早期计算机上编程时,我们需要在正确的位置设置大量开关阵列,或在纸带上穿孔并将纸带输入计算机中。你可以想象这个过程是多么冗长乏味且易于出错。即便是编写非常简单的程序,也需要有经验的人耗费很大精力才能完成。编写复杂的程序则更是难上加难。  当然了,手动输入这些晦涩难懂的位序列(1和0)来编写程序的确能让程序员感到很有成就感,而且能给你的职业带来极大的满足感。  在上面的程序中,每行都包含一条指令。我们可以用中文来描述这些指令:  1.将数字0存储在内存地址中第0的位置。  2.将数字1存储在内存地址中第1的位置。  3.将内存地址中第1的位置的值存储在内存地址中第2的位置。  4.将内存地址中第2的位置的值减去数字11。  5.如果内存地址第2的位置的值是0,则跳转到指令9。  6.将内存地址第1的位置的值加到内存地址第0的位置上。  7.将内存地址第1的位置上的值加上数字1。  8.跳转到指令3。  9.输出内存地址第0的位置上的值。  虽说这已经比一大堆位序列要好读了许多,但仍然不尽如人意。或许使用名字代替数字作为指令和内存地址的标示符,可以进一步提高代码的可读性。  现在你能看出该程序是如何工作的吗?前两行代码初始化两个内存位置的值:total用于保存累加计算结果,而count则用于记录当前数字。你可能觉得compare的那行代码看起来有些奇怪。程序想根据count是否等于11来决定是否应该停止运行。因为我们的机器相当原始,所以只能测试一个数字是否为0,并根据测试结果做出判断(是否跳转)。因此程序用名为compare的内存位置存放count–11的值,并根据该值是否为0决定是否跳转。接下来两行将count的值累加到结果上,并将count加1,直到count等于11为止。  下面使用JavaScript重新编写了上面的程序:  这个版本的程序得到了一些改进。更为重要的是,我们再也不需要指定程序如何来回跳转了,而是由while语句负责完成这个任务。只要我们给予的条件成立,while语句就会不停地执行其下方的语句块(包裹在大括号中)。而我们给予的条件是count

其他推荐