1、第4章 JavaScript的数据类型和运算符,JavaScript脚本语言同其他语言一样,有它自身的基本数据类型、表达式和算术运算符。要想编写出JavaScript程序,还需要继续深入学习JavaScript程序设计知识。JavaScript也有一套自己的语法规则和基本框架结构,这是掌握JavaScript语言的基础。,4.1 语法规则,所有的编程语言都有自己的一套语法规则,用来详细说明如何用这种语言来编写程序。对不同的编程语言来说,许多规则是类似的。但是这些语言之间也存在着不少差异,也要注意区分它们之间的不同之处。为了确保程序正确运行并减少错误结果,必须遵守这些语言各自的语法规则。在编写J
2、avaScript代码时,由于JavaScript不是一种独立运行的语言,所以必须既关注JavaScript的语法规则,又要熟悉HTML的语法规则。,4.1.1 JavaScript严格区分大小写,JavaScript是严格区分大小写的。在程序中定义一个标识符computer(首字母小写)的同时还可以定义一个Computer(首字母大写),二者是完全不同的两个符号。在输入语言的关键字、变量、函数名以及所有的标识符时,都必须采取一致的字符大小写形式。一般来说,JavaScript中使用的大多数名称都采用小写形式。如保留字全部都为小写,但也有一些名称采用大小写组合方式,如onClick、onLoa
3、d、Date.getFullYear等。因此,在编写代码时,要特别注意大小写问题。另外还要注意,HTML标记并不区分大小写。在键入表格标记时,无论是键入、还是,或者任意使用大小写字母,对于浏览器来讲意义都是一样的,都代表表格标记。由于HTML标记和客户端JavaScript经常联系在一起,所以很容易混淆。例如许多JavaScript对象和属性都与它们所代表的HTML标签和属性同名。在HTML中,这些标签和属性可以以任意大小写的方式输入,但是在JavaScript中,它们必须按规定的格式书写。,4.1.2 JavaScript程序的注释,为程序添加注释可以用来解释程序的某些部分的作用和功能,提高
4、程序的可读性。此外,还可以使用注释来暂时屏蔽某些程序语句,让浏览器暂时不要理会这些语句。等到需要的时候,只要简单的取消注释标记,这些程序语句就又可以发挥作用了。其实,注释是好脚本的主要组成部分,注释有利于提高脚本程序的可读性。为自己的程序加入适当的注释,其他人就可以借助它们来理解和维护脚本,从而有利于团队合作开发,提高开发效率。,4.1.3 JavaScript程序代码的格式,在JavaScript程序中,每条功能执行语句的最后必须用分号(;)结束。一个单独的分号(;)也可以表示一条语句,这样的语句叫做空语句。为了整齐美观而采取的对齐,或者缩进文本的编排方式不是必须的。可以按自己的意愿任意编排
5、,只要每个词之间用空格、制表符、换行符或者大括号、小括号这样的分隔符隔开就行了。在JavaScript程序中,一行可以写一条语句,也可以写多条语句。一行中写多条语句时,语句之间使用英文分号(;)分隔。一行中只写一条语句时,可以省略语句结尾的分号,此时以回车换行符作为语句的结束。,4.1.4 JavaScript常量,JavaScript的常量通常又称为字面常量。它是不能改变的数据,与基本的数据类型相对应,有以下几种常量。1整型常量2实型常量3布尔值4字符串型常量5null常量6undefined常量,4.1.5 JavaScript的空白符和换行符,JavaScript会忽略程序中记号之间的空
6、格、制表符和换行符,除非它们是字符串常量的一部分。其中记号(token),就是指一个关键字、变量名、数字、函数名或者其他各种实体。具体来说,可以分为以下3种情况。(1)如果标识符、运算符之间有多于一个的空白字符,对于解释器来讲,几个空白字符相当于起到一个空白字符的分隔作用。(2)如果在一个记号中插入了空格、制表符或写到两行上,JavaScript就会将它分成两个记号。例如:area是一个变量名,而ar ea则是两个独立的变量ar和ea。(3)如果字符串常量本身包含空格,如“cell phone”,JavaScript解释器在解释代码的过程中会保留这些空格。,4.1.6 JavaScript标识
7、符,标识符是指JavaScript中定义的符号,例如,变量名、函数名、数组名等。在JavaScript中,合法的标识符的命名规则和Java,以及其他许多语言的命名规则相同,即标识符可以由任意顺序的大小字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是JavaScript中的保留字。,4.1.7 JavaScript保留字,每种程序语言都有自己内嵌的保留字词汇,不能将它们用做变量名。JavaScript同其他语言一样也拥有自己的保留字。JavaScript保留字(Reserved Words)是指在JavaScript语言中有特定含义,成为JavaScript语法中一部
8、分的那些字。它们只能在JavaScript语言规定的场合中使用,而不能用作变量名、函数名等标识符。,4.2 基本数据类型,程序设计语言所支持的数据类型是这种语言最为基本的部分。JavaScript能够处理多种类型的数据,这些数据类型可以分为两类:基本数据类型和引用数据类型。JavaScript的基本数据类型包括常用的数值型、字符串型和布尔型,以及两个特殊的数据类型:空值和未定义。另外,它还支持复合数据类型数组、函数、对象等。由于JavaScript采用弱类型的形式,因而数据在使用前不必先作声明,而是在使用或赋值时确定其数据类型。,4.2.1 数值型,数值型(number)是最基本的数据类型,可
9、以用于完成数学运算。JavaScript和其他程序设计语言的不同之处在于它并不区别整型数值和浮点型数值。在JavaScript中,所有数字都是由浮点型表示的。目前,JavaScript采用IEEE 754标准定义的64位浮点数值格式来表示数据,所以JavaScript能表示的最大的值是1.7976931348623157 * 10308,最小值是5 * 10-324。如果一个数值直接出现在JavaScript程序中时,称为数值直接量(numberic literal)。JavaScript支持的数值直接量的形式有以下几种:1整型直接量2浮点型直接量3特殊的数值,4.2.2 字符串类型,字符串(
10、string)是由Unicode字符(JavaScript 1.3之前的版本只支持ASCII码字符)、数字、标点符号等组成的序列。它是JavaScript中用来表示文本的数据类型。JavaScript和C以及Java不同,它没有char这样的字符数据类型。要表示单个字符,必须使用长度为1的字符串。1字符串直接量2转义字符,4.2.3 布尔型,数值型数据和字符串类型的数据的值都有无穷多,但是布尔型数据的值只有两个。分别由布尔型直接量“true”和“false”来表示,分别代表真和假。它主要用来说明或代表一种状态或标志,通常是在程序中比较所得的结果。例如:x= =10这行代码测试了变量x的值是否和
11、数值10相等。如果相等,比较的结果就是布尔值true,否则结果就是false。也可以用于在条件语句中测试条件是否成立。例如:if (finished=false) document.write(请继续运行程序!);其中finished是用来代表填写是否完成的布尔型变量。如果completion的值为假表示还没有完成,因而输出“请继续运行程序!”,4.2.4 空值型,JavaScript中还有一个特殊的空值型数据,用关键字null来表示,它表示“无值”。它并不表示“null”这4个字母,也不是0和空字符串,而是JavaScript的一种对象类型。null常常被看作对象类型的一个特殊值,即代表“无
12、对象”的值。null是个独一无二的值,有别于其他所有的值。如果一个变量的值为null,那么就表示它的值不是有效的对象、数字、字符串和布尔值。null可用于初始化变量,以避免产生错误。也可用于清除变量的内容,从而释放与变量相关联的内存空间。当把null赋值给某个变量后,这个变量中就不再保存任何有效的数据了。,4.2.5 未定义值,在JavaScript中还有一个特殊的未定义值,用undefined来表示。如下情况使返回undefined值。使用了一个并未声明的变量时。使用了已经声明但还没有赋值的变量时。使用了一个并不存在的对象属性时 。一个变量的类型可以检查是否为“undefined”,但是不能
13、通过与undefined做比较来测试变量是否存在。null和undefined既有区别又有联系。null是JavaScript的保留字,而undefined却不是JavaScript中的保存留字。它是在ECMAScript v3标准中系统预定义的一个全局变量。,4.2.6 类型转换,JavaScript是一种松散类型的程序设计语言,并没有严格的规定变量的数据类型。已经定义数据类型的变量,可以在表达式中自动转换数据类型,或通过相应的方法来转换数据类型。自动类型转换有一定的规则。如果按照JavaScript的类型转换规则没有转换或者转换的类型不对,这时就需要通过相应的方法来进行转换。例如,字符串“
14、10”想要和数字10进行算术加法运算,就需要将字符串“10”转换为数值型。除了需要将字符串类型转换为数值型外,有时候也需要把数值型转换为字符串,或在其他数据类型之间进行转换。,4.3 变量,在程序运行期间,程序可以向系统申请分配若干内存单元,用来存储各种类型的数据。系统分配的内存单元要使用一个标记符来标识,并且其中的数据是可以更改的,所以称之为变量。标记内存单元的标记符就是变量名,内存单元中所装载的数据就是变量值。定义一个变量,系统就会为之分配一块内存,程序可以使用变量名来表示这块内存中的数据。,4.3.1 变量的命令,JavaScript中的变量命名与其他计算机语言非常相似,包含以下几个要点
15、:变量名必须以大写字母(AZ)、小写字母(az)或下划线(_)开头。其他的字符可以用字母、下划线或数字(09)。变量名中不能有空格、”+”号、”-“号等其他符号。不能使用JavScript中的保留字作为变量名。这些保留字是JavaScript内部使用的,不能作为变量的名称。例如var、int、double、true等都不能作为变量的名称。在对变量命名时,最好把变量名的意义与其代表的内容对应起来,以便能方便地区分变量的含义。例如,name这样的变量就很容易让人明白其代表的内容。JavaScript变量名是区分大小写的,因此在使用时必须确保大小写相同。不同大小写的变量,例如name、Name、NA
16、ME,将被视为不同的变量。JavaScript变量命名约定与Java类似。也就是说,对于变量名为一个单词的,则要求其为小写字母,例如:area。对于变量名由两个或两个以上的单词组成,则要求第二个和第二个以后的单词的首字母为大写,例如,userName。,4.3.2 变量声明,变量在使用之间必须声明。这不仅是JavaScript的要求,也是一个好的编程习惯。由于JavaScript是弱类型语言,因此它不像大多数高级语言那样强制限定每种变量的类型,也就是说在创建一个变量时可以不指定该变量将要存放何种类型的信息。实际上,根据需要,还可以给同一个变量赋予一些不同类型的数据。在JavaScript中声明
17、变量的方式有以下两种:1使用关键字var显式声明变量2使用赋值语句隐式地声明变量,4.3.3 变量赋值,不管声明变量的时候是否赋值,在程序中任何地方需要改变变量的值时都可以使用赋值语句来给变量赋值。赋值语句由变量名、等号以及确定的值组成。赋值语句的格式同上面的格式3相同,即:格式4:变量名=值; 格式3中的变量名一般是在程序中第一次出现时,表示在声明变量的同时给变量赋值。而格式4中的变量名可以是在程序中已经出现过的变量。经常是改变变量的值,甚至还能改变变量的类型。,4.4 表达式与运算符,在定义完变量之后,就可以对它们进行赋值、改变、计算等一系列操作。这一过程通常通过表达式来完成。表达式是变量
18、、常量、布尔及运算符的集合。运算符是完成操作的一系列符号。,4.4.1 表达式概述,为使变量有用,需要能够在不同的上下文中处理和评估它们,表达式提供了这一能力。本质上讲表达式不过是变量,运算符以及其他表达式的集合,所有表达式均计算成一个值。在实际中有两种类型的表达式,仅具有值的表达式以及把值赋给变量的表达式。这两种类型的实例,例如:example=“An Example”是把值赋给变量example的表达式,而“The Number is”“10”是仅具有值的表达式。,4.4.2 运算符概述,表达式是利用运算符来连接数据的。运算符是完成操作的一系列符号,运算符用于将一个或几个数据按照某种规则进
19、行运算,并产生一个操作结果。它必须作用在数据上才有效,使用运算符的数据称为操作数。根据运算类别,JavaScript中的运算符主要有算术运算符、字符串运算符、逻辑运算符、比较运算符、条件运算符等。根据操作数的个数,可以将JavaScript中的运算符分为以下几种。单目运算符:只作用于一个数据的运算符。双目运算符:作用于两个数据上的运算符。三目运算符:作用于三个数据上的运算符。,4.4.3 算术运算符,JavaScript中的算术运算符除了有标准的双目运算符加()、减()、乘(*)、除(/)这些基本运算符外,还包括其他几种。具体如下:1加(+)、减(-)、乘(*)、除(/)运算符2取模运算符(%
20、)3取反运算(-)4增量运算符(+)和减量运算符(-),4.4.4 赋值运算符,在前面创建变量时,实际上已经使用赋值运算符(=)给变量赋初值了。赋值运算符(=)的作用是将它右边的表达式计算出来的值复制给左边的变量。例如,a=5+1就表示把赋值号右边的表达式5+1计算出来的结果值6复制给左边的变量a,这样变量a的值就是6。赋值运算符(=)还可以用来给多个变量指定同一个值。例如,a=b=c=1,执行该语句后,变量a、b、c的值都为1。,4.4.5 关系运算符,关系运算符又称作比较运算符。是一个双目运算符,用于比较操作数之间的大小、是否相等等,比较运算的结果是布尔型的值true或false。比较运算
21、符的操作数可以是数值、字符串,也可以是布尔值。以下是JavaScript支持的关系运算符及其解释。:大于=:大于等于:等于:严格等于!=:不等于!:严格不等于,4.4.6 逻辑运算符,逻辑运算符通常在条件语句中使用。它们与关系运算符一起构成复杂的判断条件。JavaScript提供了3种逻辑运算符:逻辑与(&)、逻辑或(|)、逻辑非(!)。具体解释如下。逻辑与(&):当两个操作数的值都为true时,运算结果为true,否则为false。因此,如果逻辑与运算符左边的表达式的计算结果为零、null或空字符串“”,那么整个表达式的结果就是false。如果逻辑与运算符左边的表达式的计算结果为true,此
22、时计算逻辑与运算符右侧的表达式。如果这个表达式的值也是true,那么整个表达式的结果为true。否则如果左边值为true,右边值为false,那么整个表达式的值为false。逻辑或(|):只要两个操作数中有一个值为true时,运算结果就为true。如果两个操作数的值都为假,则运算结果为假。如果逻辑或运算符左边的表达式计算结果为true,那么就不再计算或运算符右边的表达式的值,并且整个表达式的值为true;如果逻辑或运算符左边的表达式计算结果为false,那么计算或运算符右侧的表达式的值,如果这个值为true,那么整个表达式的值为true;如果右侧表达式计算的结果也为false,那么整个表达式的
23、值为false。逻辑非(!):对操作数取反。即true值非运算的结果为false,false值非运算的结果为true。用于否定一个运算的结果。“真”的逻辑非值为“假”,“假”的逻辑非值为“真”。逻辑非是一个单目运算符,它只有一个操作数。,4.4.7 字符串运算符,字符串运算符只有一个字符串连接运算符(+),它是一个双目运算符。在JavaScript中,可以使用字符串连接运算符将两个字符串连接起来形成一个新的字符串。例如,“This”+“is”的运算结果为“This is”,“中国”+“青岛”运算结果为”中国青岛”。当操作数中至少有一个操作数是字符串时,JavaScript解释器将另一操作数转换
24、为字符串,其中数据转换为相应的字符串,而布尔型数据则相应地转换为“true”或“false”。例如,“36”+2的运算结果为“362”,“It is”+true的运算结果为“It is true”。另外,字符串连接运算符还可以和前面的赋值运算符联合使用,形成“+=”运算符,它的作用是,将运算符右侧的字符串拼接到该运算符左侧字符串的后面,并将结果赋值给运算符左侧的操作数。,4.4.8 其他运算符,除了前面介绍的各种运算符以外,JavaScript还提供了位操作运算符、条件运算符等其他一些十分有用的运算符。,4.4.9 运算符的优先级,运算符优先级是指在一个表达式中,运算符的优先顺序。程序的执行顺
25、序将依据运算符的优先级顺序。例如,在进行四则运算时,规则是乘除、后加减。这就是说,乘法和除法的运算优先级高于加法和减法的优先级。同一优先级的运算符按从左到右方式进行计算,这就是运算符的结合方式。所有的算术运算符都是从左向右执行,所以如果有两个或者更多的算术运算符有相同的优先级,那么左边的将先执行,然后依次执行。如果想改变运算的执行顺序,就需要使用成对的括号,括号内的运算将比括号外的运算先执行。如果两个或者两个以上的运算符有相同的优先级,JavaScript根据运算符的执行顺序进行排序。一般的都是从左向右。但是也有一些是从右向左。,4.4.10 表达式中的类型转换,JavaScript是一种称为
26、松散类型的程序设计语言,并没有严格的规定变量的数据类型。也就是说,已经定义数据类型的变量,在表达式中会按一定的规则自动进行数据类型的转换。当表达式中出现不同数据类型时,JavaScript会自动进行数据类型转换以使它们相容。通常来讲,类型转换是根据优先级进行的。在JavaScript中,字符串优先级最高,然后依次是浮点型、整型、布尔型。,4.5 正则表达式,正则表达式是由英文词语Regular Expression翻译而来。最早是在1956年,一位叫Stephen Kleene的美国数学家在Warren McCulloch和Walter Pitts早期工作的基础上,发表了一篇标题为“神经网事件
27、的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。随后,正则表达式被应用于Unix中的qed编辑器。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被Open Group组织认定。,4.5.1 正则表达式定义,在Windows操作系统中,使用“?”和“*”通配符来查找硬盘上的文件时,“?”通配符匹配文件名中的单个字符,“*”通配符匹配零个或多个字符。data?.tex就是一种文本模式,它能匹配data1.tex、dat
28、a2.tex、dataX.tex等等文件名。同理data*.tex就是另外一种文本模式。正则表达式的功能和概念类似“?”和“*”通配符,但它的功能更强大,而且更灵活。正则表达式就是符合某种规则的表达式。可以将正则表达式理解为一种对文字进行模糊匹配的语言,它用一些特殊的符号(称为元字符)来代表具有某种特性(例如,某一个字符必须是数字字符)的一组字符以及指定匹配的次数。含有元字符的文本不再表示某一具体的文本内容,而是形成了一种文本模式,它可以匹配符合这种模式的所有文本串。,4.5.2 RegExp对象,JavaScript中提供了一个名为RegExp的对象来完成有关正则表达式的操作和功能,每一条正
29、则表达式模式对应一个RegExp对象实例。在JavaScript中,有两种方式可以创建RegExp对象的实例:(1)使用RegExp对象的显示构造函数,语法为:var varname=new RegExp(“pattern,”flags”)(2)使用RegExp对象的隐式构造函数,采用纯粹的文本格式:/pattern/flags,4.5.3 RegExp对象的属性,RegExp对象的属性分为两类。一类是所有RegExp对象实例共享的静态属性,另一类是属于单个对象实例的属性。不用创建RegExp对象实例,就可以用RegExp对象名直接引用静态属性。RegExp对象的静态属性是一种全局变量,Reg
30、Exp创建的所有对象实例共享这些变量,对任何一个RegExp对象实例的操作都可以修改这些变量。在每次创建新的RegExp对象实例时,RegExp中的一些静态属性也会修改。这好比有一个名为“中国人”的对象,它里面有一个名为“人口数”的静态属性,每次创建一个新的“中国人”对象实例时,“人口数”就会发生修改。1静态属性2对象实例属性,4.5.4 正则表达式的string方法,在程序中可以使用正则表达式对象的exec()和test()方法进行字符串测试和匹配,也可以使用String对象的4个方法完成这些任务。在完成某些操作时,这些方法会更简单有效。1match方法2replace()方法3search
31、()方法4split()方法,4.5.5 高级正则表达式,前面学习的正则表达式比较简单,大部分都是由普通字符构成的。完成各种查找和匹配的操作使用普通字符串也可以完成。但正则表达式不同于普通字符串的主要地方在于在正则表达式中可以使用代表各种含义的特殊字符。这些特殊字符在正则表达式中不是表示字符本身,在对其进行匹配时需要进行特殊的处理。利用这些特殊字符可以构造非常复杂的正则表达式,来满足各种各样的匹配需求,这也正是正则表达式能够发挥强大作用,具有很强表达能力的法宝。要匹配这些特殊字符,必须首先将这些字符转义,也就是在前面使用一个反斜杠()。下表列出了这些特殊字符及其含义。1非打印字符 2.字符类 3表示重复的字符 4其他符殊字符,4.6 小结,本章主要介绍了JavaScript的基本数据类型和基本运算符。通过对JavaScript语法规则的了解,熟悉JavaScript程序代码的格式。本章的知识重点是JavaScript表达式和运算符的操作方法。知识难点是正则表达式的定义及对象和方法的使用。,