商家名称 | 信用等级 | 购买信息 | 订购本书 |
![]() |
JavaScript编程精解(哈弗贝克著) | ![]() |
|
![]() |
JavaScript编程精解(哈弗贝克著) | ![]() |
前言
20世纪70年代,业界首次推出个人计算机时,大多数计算机都内置一种简单的编程语言—通常是BASIC的变体,人与计算机之间的互动需要通过这种语言实现。这意味着,对天生喜欢钻研技术的人来说,从单纯使用计算机到编程的过渡非常容易。
现在的计算机相比20世纪70年代的功能更加强大,价格也更加便宜,软件接口呈现的是使用鼠标操作的灵活图形界面,而不是语言界面。这使计算机更容易使用,总的来说,这是一个巨大的进步。然而,这也在计算机用户与编程世界之间制造了一个障碍—业余爱好者必须积极寻找自己的编程环境,而不是一打开电脑就呈现的环境。
实质上,计算机系统仍然被各种编程语言控制。大多数的编程语言都比早期个人计算机中的BASIC语言更加先进。例如,本书的主题—JavaScript语言,就存在于每一款主流Web浏览器中。
关于编程
不愤不启,不悱不发。举一隅不以三隅反,则不复也。
——孔子
本书除了介绍JavaScript外,也致力于介绍编程的基本原理。事实上,这种编程还是比较难的。编程的基本规则通常都简单明了,但计算机程序构建在这些基本规则之上后,会变得很复杂,产生了其自身的规则和复杂性。正因为如此,编程并不是那么简单或可预测的。正如计算机科学的鼻祖高德纳(Donald Knuth)所说,编程是一门艺术,而不是一门科学。
要想从本书里获取最大收获,不能仅仅依靠被动阅读。一定要集中注意力去理解示例代码,只有确定自己真正理解了前面的内容,才能继续往下阅读。
程序员对其创造的宇宙负全部责任,因为他们是创造者。以计算机程序的形式,可创造出无限复杂的宇宙。
——Joseph Weizenbaum,《Computer Power and Human Reason》
一个程序包含很多含义。它是程序员敲出的一串字符,是计算机运行的指向力,是计算机内存中的数据,还控制同一个内存上的执行动作。仅使用熟悉的类推法比较程序与对象往往还不够,因为从表面上看适合该操作的是机器。机械表的齿轮巧妙地啮合在一起,如果表的制造者技术很棒,它就能够连续多年准确地显示时间。计算机程序的元素也以类似的方式组合在一起,如果程序员知道自己在做什么,那么这个程序就能够正常运行而不会崩溃。
计算机作为这些无形机器的载体而存在。计算机本身只会做简单直接的工作。它们之所以如此有用,是因为它们能够以惊人的速度完成这些工作。程序可以巧妙地把许多简单动作结合起来,去完成非常复杂的工作。
对有些人来说,编写计算机程序是一种很有趣的游戏。程序是思想的构筑,它零成本、零重量,在我们的敲打中不断发展。如果我们不细心,它的规模和复杂性将失去控制,甚至创造者也会感到混乱。这就是编程的主要问题:控制好程序。程序在工作时是很不可思议的,编程的艺术就是控制复杂性的技巧,好的程序其复杂性也会降低。
如今,很多程序员认为只要在程序中使用少量易于理解的技术,就可以最有效地降低复杂性。他们制定了严格的编程规则(最佳实践)及书写格式,那些破坏规则的人被称为“差劲”的程序员。
丰富多彩的编程世界里包含了太多的复杂性!让我们努力将程序变得简单和可预测,并为所有奇妙和优美的程序制定禁忌规则。编程技术的前景是广阔的,其多样性使人着迷,它的世界仍有很多未被探索的部分。编程过程中有很多陷阱和圈套,缺乏经验的程序员会犯各类糟糕的错误,告诫我们需要谨慎,并保持头脑清醒。学习编程时总是需要探索新的挑战、新的领域,拒绝不断探索的程序员必定会停滞不前、忘记编程的快乐、并失去编程的意志(或成为管理人员)。
语言为何很重要
在计算机诞生初期并没有编程语言。程序看起来就像这样:
这是一个从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,从而确定能否停止运行。由于该机器相当原始,它只能测试一个数字是否为零,并在此基础上做出判断(跳转),因此它使用标记compare的存储单元来计算count的值,即11,并在该值的基础上做出判断。后面两行代码将count的值添加到结果total上,当程序判断count不是11时,为count加1。
下面是用JavaScript编写的有同样效果的程序。
这段程序有了更多的改进。最重要的是,不再需要指定程序来回转换的方式,while这个神奇的单词会帮助解决这个问题。只要满足给定的条件:count <= 10(意思是“count小于或等于10”),它就会继续执行下面几行代码。不再需要创建临时的值并将该值与零比较——这是一个没有意义的细节,编程语言就是用于解决这些无意义的细节。
最后,如果我们可以使用方便的range和sum操作(分别在区间范围(range)里创建一组数字,并计算该组数字的总和(sum)),代码应该是这样的:
从上例可以看出,同样的程序可以使用长或短、不可读或可读的方式来表达。该程序的第一个版本非常晦涩,而最后一个版本基本上都是语言描述:打印(print)出从1到10这个区间范围(range)的总和(sum)。(我们将在后面的章节中讲述如何创建sum及range等函数。)
优秀的编程语言会提供一种更为抽象的表达方式来帮助程序员表达其意图。这种语言隐藏无意义的细节,提供方便的程序块(例如while语句),在很多时候,它允许程序员自己添加程序块(例如sum和range操作)。
什么是JavaScript
JavaScript语言目前主要用于解决万维网页面的各种难题。近年来,该语言也开始应用于其他环境中,如node.js框架(一种使用JavaScript语言编写快速服务器端程序的方式),最近吸引了不少关注。如果对编程感兴趣,JavaScript绝对是值得学习的语言。即使以后不会从事大量的网络编程工作,本书中展示的一些程序也会一直伴随着你,影响你使用其他语言编写的程序。
有些人指出了JavaScript语言不好的地方,其中很多观点都是对的。当我第一次用JavaScript写程序时,我立刻就开始轻视这种语言了,它接受我输入的大部分代码,但其解释代码的方式与我的意图完全不同。无可否认,这与我做事没有头绪有很大的关系,但也存在着一个真正的问题:JavaScript允许的操作实在是太多了。这种设计的初衷是让初学者更易掌握JavaScript编程方法。实际上,这使得更难发现程序中的问题,因为系统不会指出问题所在。
然而,语言的灵活性也是一种优势。它为很多无法使用更强大语言的技术留下了发展空间,正如我们将在后面几章中看到的,它能够克服JavaScript的一些缺点。当正确学习JavaScript并使用了一段时间之后,我发现自己真正的喜欢上了这种语言。
与这种语言的名字所暗示的不同,JavaScript与Java编程语言并没有多大关系。相似的名字是基于营销的考虑,而不是为了获得好评。网景公司于1995年推出JavaScript时,Java语言正在极力推广中,并且很受欢迎。很显然,当时有人认为借助Java语言的成功进行营销是个好主意。于是,就有了现在看到的这个名字。
与JavaScript有关的是ECMAScript。当网景浏览器以外的浏览器开始支持JavaScript或类似语言时,出现了一份准确描述该语言应该如何工作的文档。此文档里所描述的语言称为ECMAScript,它是以制定该设计语言标准的欧洲计算机制造商协会(ECMA)的名称命名的。ECMAScript描述了一种多用途编程语言,但并没有提及它与Web浏览器的集成。
现在有多个版本的JavaScript。本书讲的是ECMAScript 3版本,是第一个各种浏览器都支持的版本。在过去的几年中,人们进一步发展这种语言,但是,这些扩展版本只有受到浏览器的广泛支持才是有用的(至少在网络编程方面),而浏览器要跟上编程语言的发展也需要很长一段时间。幸运的是,新版本的JavaScript基本上是ECMAScript 3的扩展版本,因此本书中的大部分内容都不会过时。
第1章 JavaScript基础:值、变量、控制流程
计算机世界里只有数据,没有数据计算机就不存在。所有数据实质上都是由bit序列构成的,因此基本上都是相似的。bit序列通常是由0和1两种数字排列组合而成的,它们在计算机内的形式就如一个高电荷或一个低电荷、一个强信号或一个弱信号,或光盘表面的一个亮点或一个暗点。
1.1 值
虽然构成相同,但每一部分数据都扮演着自己的角色。在JavaScript系统中,大多数数据都被有序地分成了各种值。每个值都有一个类型,用于确定它扮演的角色类型。JavaScript里有6种基本类型的值:number、string、Boolean、object、function和undefined。
创建值的时候,只需调用它的名称即可,非常方便。无需为创建的值收集构建素材或是支付费用,只要调用某个值,便可立即获得该值。当然,值也不是凭空创建的,每个值都需要存储在某个地方,如果在同一时间使用大量的值,就有可能耗尽内存, 幸运的是,只有在同时使用大量数据的时候才会出现这个问题。一旦不再需要这个值,它将会消失,只剩下一些bit数据,用于再次生成值。
相关阅读:
更多图书资讯可访问读书人图书频道:http://www.reAder8.cn/book/