频道栏目
读书频道 > web开发 > Javascript > JavaScript编程精解(原书第2版)
前言
2015-12-03 15:29:19     我来说两句
收藏   我要投稿
《高级程序设计(第3版)》是 超级畅销书的**新版。ECMAScript 5 和HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为 增添了很多适应未来发展的新特性。本书这一版除增加5 章  立即去当当网订购

本书讲解如何通过编程来让计算机执行任务。时至今日,计算机就像螺丝刀一样随处可见,但相比于螺丝刀而言,计算机中包含了更多隐含的复杂性,因此也更加难以理解和操作。许多人仍对计算机感到陌生和恐惧。


 

一边是有血有肉的具备社交才能和空间推理能力的人类,另一边是冰冷的处理二进制数据的计算机,这两者该如何进行交互呢?我们已经找到了两种高效的方式来搭建人类与计算机之间通信的桥梁。第一种方法是模拟现实世界来构建与计算机交互的接口,这样我们就可以动动手指来操作计算机屏幕上的图形。对于一般的机器交互来说,这种方式非常实用。

但是,我们在使用这种方法的情况下,只能通过点击操作实现接口设计者预先定义好的功能。幸运的是,我们可以利用人类的语言天赋来教会计算机一门语言,实现开放式接口。比如指挥计算机执行任意一种任务。

人类语言可以用多种方式来组合单词和短语,表述出不同的信息。虽然计算机语言的语法灵活性没那么高,但也是采用了类似的原则进行设计的。

在过去的20年中,越来越多的人开始使用计算机来进行简易的运算,曾经作为默认人机交互方式的命令行接口,现如今已经被图形界面所取代。但只要你细心观察,就会发现基于语言的接口仍在那里。比如JavaScript语言,你几乎可以在每个网页浏览器中找到它的身影,而消费者的设备都可以执行这门语言。

本书的主要内容就是介绍这门语言,在阅读完本书后,相信你可以通过该语言来对计算机编程

关于程序设计

不愤不启,不悱不发,举一隅不以三隅反,则不复也。

—孔子

除了讲解JavaScript之外,本书也会介绍一些程序设计的基本原则。程序设计还是比较复杂的。编程的基本规则通常简单清晰,但在这些基本规则之上构建的程序却容易变得复杂,导致程序产生了自己的规则和复杂性。即便程序是按照你自己的思路去构建的,你也有可能迷失在代码之间。

阅读本书时,你有可能会觉得书中的概念难以理解。如果你刚刚开始学习编程,那么你估计还有不少东西需要掌握呢。如果你想将所学知识融会贯通,那么就需要去多参考和学习一些资料。

是否付出必要的努力完全取决于你自己。当你阅读本书的时候发现任何难点,千万不要轻易就对自己的能力下结论。只要能坚持下去,你就是好样的。稍做休息,复习一下所学的知识点,确保自己阅读并理解了示例程序和相关的练习。学习是一项艰巨的任务,但你掌握的所有知识都属于你自己,而且今后的学习道路会愈加轻松。

计算机程序员对其创造的宇宙负全部责任,因为他们是创造者。以计算机程序的形式,可创造出无限复杂的宇宙。

—约瑟夫·魏泽鲍姆《计算机的威力与人类的理性》

一个程序有很多含义:它是开发人员编写的一段文本、计算机执行的一段指令集合、计算机内存当中的数据以及控制内存中数据的操作集合。我们通常很难将程序与我们日常生活中熟悉的事物进行对比。有一种表面上比较恰当的比喻,即将程序视作包含许多组件的机器,为了让机器正常工作,这些组件通过内部通信来实现整个机器的正常运转。

计算机正是运行这些非物质机器的载体。计算机本身并不能实现多么复杂的功能,但计算机之所以有用是因为它们的运算速度非常快。而程序的作用就是将这些看似简单的动作组合起来,然后实现复杂的功能。

对于我们当中的某些人来说,编写计算机程序是一种极大的乐趣。程序是开发人员思想的结晶。编写程序不需要什么物质投入,它很轻量级,通过我们的双手创造。

但如果不稍加注意,程序的体积和复杂度就会失去控制,甚至代码的编写者也会感到迷惑。

在可控的范围内编写程序是编程过程中首要解决的问题。当程序运行时,一切都是那么美好。编程的精粹就在于如何更好地控制复杂度。质量高的程序的复杂度都不会太高。

很多开发人员认为,控制程序复杂度的最好方法就是避免使用不熟悉的技术。他们制定了严格的规则(“最佳实践”),定义了程序应该编写成什么样子。而激进分子更是觉得,如果程序没有按照这些规则进行编写,那么编写这些程序的开发人员就是不合格的。

这极大地降低了程序的丰富程度!将程序简化成一些直截了当的代码,并完全禁止人们编写丰富多样的程序。正是因为程序当中有那么多不同的思想和未经探索的领域,才使得编程技术如此令人着迷。诚然,程序设计的世界中充满各色陷阱,让一个缺乏经验的程序员陷入其中非常危险,但这也只是意味着在前行过程中你需要小心谨慎,时刻保证头脑清醒,毕竟我们还要面对许多新挑战,探索更多新的领域。而那些不愿探索的人只会停滞不前,淡忘编程的乐趣,厌倦自己的事业。

为什么编程语言如此重要

在计算技术发展伊始,并没有编程语言这个概念。程序看起来就像这样:


 

该程序计算数字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 <= 10,意思是“count小于等于10”。我们再也不需要创建临时的值并将其与0比较,那样的代码十分烦琐。编程语言的一项职责就是帮助我们处理这些烦琐无趣的逻辑。

在程序的结尾,也就是while语句结束后,我们使用console.log操作来输出结果。

最后,我们恰好有range和sum这类方便的操作。下面代码中的range函数用于创建数字集合,sum函数用于计算数字集合之和:


 

我们可以从这里了解到,同一个程序可以用不同的方式进行编写,代码的长度可长可短,而可读性可高可低。第一个版本的程序晦涩难懂,而最后一个版本的程序则接近于人类语言的表达方式:将1~10范围内的数字之和记录下来(我们会在后面的章节中详细介绍如何编写sum和range这样的函数)。

优秀的编程语言可以为开发人员提供更高层次的抽象,使用类似于人类语言的方式来与计算机进行交互。它还可以提供便捷的语句块(比如while和console.log),以避免开发人员编写烦琐的代码细节。它甚至可以让你定义自己的语句块(比如sum和range函数),并提供方便的方法来编写这些语句块。

什么是JavaScript

JavaScript诞生于1995年。起初,Netscape Navigator浏览器将其运用在网页上添加程序。自此以后,各类主流图形网页浏览器均采用了JavaScript。JavaScript使得现代网页应用程序成为可能—使用JavaScript可以直接与用户交互,从而避免每一个动作都需要重新载入页面。但有许多传统网站也会使用JavaScript来提供实时交互以及更加智能的表单功能。
JavaScript其实和名为Java的程序设计语言没有任何关系。起了这么一个相似的名字完全是市场考虑使然,这并非是一个明智的决定。当JavaScript出现时,Java语言已在市场上得到大力推广且拥有了极高人气,因此某些人觉得依附于Java的成功是个不错的主意。而我们现在已经无法摆脱这个名字了。

在JavaScript被广泛采用之后,为了确保所有声称支持JavaScript的软件都使用同一种语言,ECMA国际制订了一份标准文档来描述JavaScript的工作行为,标准化完成后,该标准被称为ECMAScript标准。实际上,术语ECMAScript和 JavaScript可以交换使用。它们不过是同一种语言的两个名字而已。

许多人会说JavaScript这样那样的不好。这其中有很多这样的言论都是正确的。当被要求第一次使用JavaScript编写代码时,我当时就觉得这门语言难以驾驭。JavaScript接受我输入的任何代码,但是又使用和我的想法完全不同的方式来解释代码。由于我没有任何线索知道我之前做了什么,因此我需要做出更多工作,但这也就存在一个实际问题:我们可以自由使用JavaScript,而这种自由却几乎没有限度。这种设计其实是希望初学者更容易使用JavaScript编写程序。但实际上,系统不会指出我们错在何处,因此从程序中找出问题变得更加棘手。

但这种自由性也有其优势,许多技术在更为严格的语言中不可能实现,而在JavaScript中则留下了实现的余地,正如你看到的那样(比如第10章),有些优势可以弥补JavaScript的一些缺点。在正确地学习JavaScript并使用它工作了一段时间后,我真正喜欢上了JavaScript。

JavaScript版本众多。大约在2000~2010年间,这正是JavaScript飞速发展的时期,浏览器支持最多的是ECMAScript 3。在此期间,ECMA着手制定ECMAScript 4,这是一个雄心勃勃的版本,ECMA计划在这个版本中加入许多彻底的改进与扩展。但由于ECMAScript 3被广泛使用,这种过于激进的修改必然会遭遇重重阻碍,最后ECMA不得不于2008年放弃了版本4的制定,因此ECMA于2009年发布了改进较少的ECMAScript 5。目前所有主流浏览器均支持ECMAScript 5,因此本书着重介绍该版本。版本6的制定工作即也将完成,而且一些浏览器已经开始支持该版本的一些新特性了。

Web浏览器并不是唯一一个可以运行JavaScript的平台。有些数据库,比如MongoDB和CouchDB,也使用JavaScript作为脚本语言和查询语言。一些桌面和服务器开发的平台,特别是Node.js项目(第20章介绍),也在浏览器之外提供了强大的JavaScript开发环境。
 
代码及相关工作

代码是程序的文本内容。本书多数章节都介绍了大量代码。根据个人经验,阅读与编写代码是学习程序设计过程中必不可少的一部分,因此万万不可走马观花般地阅读代码,而应该认真阅读并理解每个示例。刚开始使用这种方式可能会速度较慢并为代码所困惑,但我坚信你很快就可以熟能生巧。对待习题的方法也应该一样。除非你确实已经编写代码解决了问题,否则不要假设你已经理解了问题。

建议读者应尝试在实际的JavaScript解释器中执行习题代码。这样一来,你就可以马上获知代码工作情况的反馈,而且我希望读者去做更多的试验,而不仅仅局限于习题的要求。
可以在http://eloquentjavascript.net/中查阅本书的在线版本,并运行和实验本书中的代码。也可以在在线版本中点击任何代码示例来编辑、运行并查看其产生的输出。在做习题时,你可以访问http://eloquentjavascript.net/code/,该网址会提供每个习题的初始代码,让你专心于解答习题。

如果想要在本书提供的沙箱以外执行本书代码,需要稍加注意。许多的示例是独立的,而且可以在任何JavaScript环境下运行。但后续章节的代码大多数都是为特定环境(浏览器或者Node.js)编写的,而且只能在这些特定环境下执行代码。此外,许多章节定义了更大的程序,这些章节中出现的代码片段会互相依赖或是依赖于一些外部文件。本书网站的沙箱提供了zip压缩文件的链接,该文件包含了所有运行特定章节代码所需的脚本和数据文件。

章节介绍

本书包括三个部分。前11章讨论JavaScript语言本身的一些特性。接下来的8章讨论网页浏览器和JavaScript在网页编程中的实践。最后两章专门讲解另一个使用JavaScript编程的环境—Node.js。

纵观本书,共有5个项目实战章,用于讲解规模较大的示例程序,你可以通过这些章来仔细品味真实的编程过程。根据项目出现次序,我们会陆续构建人工生命模拟项目、程序设计语言项目、平台游戏项目、绘图程序和一个动态网站项目。

本书介绍编程语言时,首先使用4章来介绍JavaScript语言的基本结构,包括控制结构(比如在本前言中看到的while单词)、函数(编写你自己的操作)和数据结构。此后你就可以编写简单的程序了。接下来,第5章和第6章介绍函数和对象的运用技术,以编写更加抽象的代码并以此来控制复杂度。

介绍完第一个项目实战之后,将会继续讲解处理错误与修复的方法、正则表达式(处理文本数据的重要工具)与模块化(解决复杂度的问题)。第二个项目实战章则是对本书第一部分的总结。

第二部分(第12章~第19章),阐述了浏览器JavaScript中的一些工具。你将会学到在屏幕上显示某些元素的方法(第13章与第16章),响应用户输入的方法(第14章与18章)和通过网络通信的方法(第17章)。该部分又有两个项目实战章。

此后,第20章阐述Node.js,而第21章使用该工具构建一个简单的网页系统

最后,第22章讲解一些在优化JavaScript程序运行速度时需要注意的事项。

本书版式约定

本书中存在大量代码,程序(包括你迄今为止看到的一些示例)代码的字体如下所示:


 

为了展示程序产生的输出,本书常在代码后编写代码期望输出,输出结果前会加上两个反斜杠和一个箭头。


 

最后,祝各位好运!

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:赞誉
下一篇:目录
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站