JavaScript编程精解(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-23 19:51:43

点击下载

作者:(美)哈弗贝克(Haverbeke,M.)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

JavaScript编程精解(第2版)

JavaScript编程精解(第2版)试读:

前言

。——英国CNET前言

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

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

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

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

在过去的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程序运行速度时需要注意的事项。本书版式约定

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

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

最后,祝各位好运!第一部分 JavaScript编程语言

·第1章 值、类型和运算符

·第2章 程序结构

·第3章 函数

·第4章 数据结构:对象和数组

·第5章 高阶函数

·第6章 深入理解对象

·第7章 项目实战:构建电子生态系统

·第8章 处理缺陷与错误

·第9章 正则表达式

·第10章 模块

·第11章 项目实战:开发编程语言第1章 值、类型和运算符

在计算机的世界当中,只有数据你可以读取、修改以及新建数据,数据可以用来表示任何信息。所有的数据都用类似的方式进行存储:长位(bit)序列。

我们通常使用二值(0和1)来表示位。在计算机中,位可以用一个高电荷或者一个低电荷,一个强信号或者一个弱信号,抑或是光盘表面的凹凸点来表示。任何离散信息都可以简化成由0与1组成的序列,因此这些信息都可以表示成位序列。

举例来说,用位序列来表示数字13。我们可以仿照写十进制数字的方法来写位序列,只是在写位序列的时候用的不是十个不同的数字,而是两个。其中数字的权值以2为因子从右到左依次递增。以下是用位序列来表示的数字13,其中每一位数字下方标注了该位的权值:

因此,二进制数00001101,或者说是8+4+1,即等于13。1.1 值

让我们设想一下包含大量位序列的情况,在一台标准现代计算机的易失性数据存储设备中,就会包含超过300亿位的数据。而非易失性存储设备(硬盘之类的存储设备)则可以存储更多的数据。

为了能够顺利操作如此多的位数据而又不引起数据丢失,我们可以将这些位划分成表示不同信息的块。在JavaScript中,我们将这些数据块称为值。虽然所有的值都是由位序列构成的,但是它们的功能却各不相同。每个值的类型决定了其功能定义。在JavaScript中包含6种基本的值类型:数字(number)、字符串(string)、布尔值(boolean)、对象(object)、函数(function)和未定义类型(undefined)。

创建值的时候,只需要调用其名称即可,非常方便。我们不需要预先了解新创建的值的类型或者为其预先开辟存储空间,只需调用某个值,即可立刻获取到它。当然,这些值也不会凭空产生,每个值总要有一个地方来进行存储,如果你想在同一时间存储海量的值数据,可能就会耗尽内存空间。不过幸运的是,只有你同时需要这么多数据的情况下,才会出现这种问题。如果你不再需要使用某个值了,这个值所对应的数据就会被清理和回收,供其他值来使用。

本章将会介绍JavaScript程序当中的基本元素,包括简单的值类型以及值运算符。1.2 数字

数字(number)类型的值即数字值。在JavaScript中写成如下形式:

在程序中使用这个值的时候,就会将数字13以位序列的方式存放在计算机的内存当中。

JavaScript使用固定长度为64的位序列来存储数字值。我们只能使用64位存储序列产生一定数量的组合,因此可以表示的数字个数也是有限的。对于十进制数来说,如果长度有N位,那么我们可以用N其表示10个数字。同理,对于二进制数来说,如果长度有64位,则64可以表示2个数字,大约是1800亿亿(18后面跟18个0)个数字,这个数量已经相当大了。

在过去计算机的内存容量要比现在小得多,因此人们一般会使用长度为8或16的位序列来表示数字。在这么小的范围内数字很容易溢出,即给定的位序列无法存储超过这个范围的数字。而现在即便是个人计算机也会配置大量内存,因此我们使用64位数据块来存储数字也不是什么问题,也就是说在处理超大数字的时候也无需担心溢出。

但是在JavaScript中并不可以使用所有小于1800亿亿的数字。这块长度为64的位序列还要能够表示负数,所以需要有一位符号位用来表示数字的正负。还有一个需要我们关注的问题是如何表示非整数,为了实现该功能,还需要使用一些位来存储小数点的位置。因此,在JavaScript中实际可存储的数字范围是1900万亿(9后面跟15个0),这依旧是一个很大的数字。

使用小数点来表示分数。

对于过大或过小的数字来说,可以使用带e(即exponent,指数)的科学技术法来表示,并在e的后面紧跟该数的指数。8

即2.998×10=299,800,000。

当计算小于前文当中提到的9000万亿的整数时,其计算结果会十分精确,不过在计算小数的时候精度却不高。正如(pi)无法使用有限个数的十进制数字表示一样,在使用64位来存储分数时也同样会丢失一些精度。虽说如此,但这类丢失精度只会在一些特殊情况下才会出现问题。因此我们需要注意在处理分数时,将其视为近似值,而非精确值。1.2.1 算术

与数字密切相关的就是算术。比如,加法或者乘法之类的算术运算会使用两个数值,并产生一个新的数字。JavaScript中的算术运算如下所示:

我们把“+”和“*”符号称为运算符。第一个符号表示加法,第二个符号表示乘法。将一个运算符放在两个值之间,该运算符将会使用其旁边的两个值产生一个新值。

在上述示例当中是“4加100,再将加的结果乘以11”,还是先做乘法再做加法?如你所想,这里会先做乘法。但在数学运算中,我们可以将加法用括号括起来,改变运算次序。“–”运算符表示减法,“/”运算符则表示除法。

在运算符同时出现,并且没有括号的情况下,其运算顺序根据运算符优先级确定。示例中的乘法运算符优先级高于加法。而“/”运算符和“*”运算符优先级相同,“+”运算符和“–”运算符优先级也相同。当多个具有相同优先级的运算符相邻出现时,运算从左向右执行,比如1–2+1的运算顺序是(1–2)+1。

你无需担心这些运算符的优先级规则,不确定的时候只需要添加括号即可。“%”符号表示余数运算,读者可能对这个算术运算符不太熟悉。X%Y表示求X除以Y后所得的的余数。比如314%100的结果是14,而144%12的结果是0。求余运算符的优先级和乘除法相同。该运算符常常被称为模数运算符,但准确来说还是应该称其为求余运算符。1.2.2 特殊数字

在JavaScript中有三个特殊的值,它们虽然是数字,但看起来却跟一般的数字不太一样。

前两个是Infinity和-Infinity,它们分别表示正无穷大和负无穷大。Infinity–1的结果仍然是Infinity,以此类推。不要过于依赖无穷运算的结果,因为这类运算并不真正属于数学运算,由此我们可以引出下一个特殊数字:NaN。

虽然NaN是数字类型的值,但我们用其表示“非数值”。举例来说,在计算0/0(0除以0)、Infinity–Infinity或当数值运算中产生不精确或毫无意义的结果时,就用NaN来表示。1.3 字符串

另一个基本数据类型是字符串,我们使用字符串来表示文本信息。使用引号将内容括起来。

其中,单引号和双引号都可以用来标记字符串,只要保证字符串前后引号一致即可。

我们几乎可以在引号中填写任何字符,JavaScript会使用这些字符来生成字符串。但填写有些字符会稍微复杂一些。比如将引号放在引号中就比较麻烦。另外,由于字符串只能放在一行里,所以换行符(输入回车键所产生的字符)也无法放在引号之间。

若要将这些字符存入字符串,需要使用下列规则:当反斜杠(\)出现在引号之间的文本中时,表示紧跟在其后的字符具有特殊含义,我们将其称之为转义符。当引号紧跟在反斜杠后时,并不意味着字符串结束,而表示这个引号是字符串的一部分。当字符n出现在反斜杠后时,JavaScript将其解释成换行符。以此类推,\t表示制表符,我们来看看下面这个字符串:

该字符串实际表示的文本是:

当然了,有时你希望字符串中的反斜杠就表示反斜杠本身,而非特殊字符。你可以使用两个连续的反斜杠来表示一个反斜杠,最后的字符串值中也只会留下一个反斜杠。因此,字符串“A newline character is written like"\n"”可以写成:

我们不能将除法、乘法或减法运算符用于字符串,但是“+”运算符却可以。这种情况下,运算符并不表示加法,而是连接操作:将两个字符串连接到一起。以下语句可以产生字符串“concatenate”:

还有很多其他方式来操作字符串,我们会在第4章中进行讨论。1.4 一元运算符

并非所有的运算符都是用符号来表示,还有一些运算符是用单词表示的。比如typeof运算符,会产生一个字符串的值,内容是给定值的具体类型。

我们会在示例代码中使用console.log命令来打印并表示我们需要查看的一些运算结果。当你执行了这段代码后,屏幕上就会显示出运算产生的值,而如何显示结果则取决于执行程序所使用的JavaScript环境。

我们所见过的绝大多数运算符都使用两个值进行操作,而typeof仅接受一个值进行操作。使用两个值的运算符称为二元运算符,而使用一个值的则称为一元运算符。减号运算符既可用作一元运算符,也可用作二元运算符。1.5 布尔值

我们常常需要用一个值来简单地区分两种可能性,比如说“是”和“否”以及“开”和“关”。JavaScript使用布尔类型来表示这种情况,该类型的值只有两种取值:true和false(就用这两个英文单词来表示)。1.5.1 比较

一种产生布尔值的方法如下所示:“>”和“<”符号分别表示“大于”和“小于”。这两个符号是二元运算符,通过该运算符返回的结果是一个布尔值,表示其运算是否为真。

我们可以使用相同的方法比较字符串。

字符串的比较是按照字母顺序来进行比较的,大写字母总是“小于”小写字母,因此"Z"<"a"的结果为真,另外字符顺序中也包括了非字母字符(比如!、–等)。实际上字符的比较是基于Unicode标准实现的。该标准为你需要的每个字符赋予了一个数字,包括希腊文、阿拉伯文、日文和泰米尔文等。使用这些数字有助于将字符串存储在计算机中,因为这样我们就可以将字符与数字一一对应,并将字符串存储成数字的序列了。在比较字符串时,JavaScript从左向右逐个比较每个字符对应的数字编码。

其他类似的运算符则包括>=(大于等于)、<=(小于等于)、==(等于)和!=(不等于)。

在JavaScript中,只有一个值不等于其自身,那就是NaN(Not a Number,非数值)。

NaN用于表示非法运算的结果,正因如此,不同的非法运算结果也不会相等。1.5.2 逻辑运算符

还有一些运算符可以应用于布尔值上。JavaScript支持三种逻辑运算符:与(and)、或(or)和非(not)。这些运算符可以用于推理布尔值。

&&运算符表示逻辑与,该运算符是二元运算符,只有当赋给它的两个值均为true时其结果才是真。

||运算符表示逻辑或。当两个值中任意一个为true时,结果就为真。

感叹号(!)表示逻辑非,该运算符是一元运算符,用于反转给定的值,比如!true的结果是false,而!false结果是true。

在混合使用布尔运算符和其他运算符的情况下,总是很难确定什么时候需要使用括号。实际上,只要熟悉了目前为止我们介绍的运算符,这个问题就不难解决了。||优先级最低,其次是&&,接着是比较运算符(>,==等),最后是其他运算符。基于这些优先级顺序,我们在一般情况下最好还是尽量少用括号,比如说:

现在我们来讨论最后一个逻辑运算符,它既不属于一元运算符,也不属于二元运算符,而是三元运算符(同时操作三个值)。该运算符由一个问号和冒号组成,如下所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载