2.1 程序结构
在第1章里,已经见过JavaScript代码了,示例代码如下:
let a=5;
在这一行代码里包括了6项基本结构,下面分别介绍一下。
1.关键字
最开始的let是一种关键字(Keyword),用来对变量a进行声明。关键字是JavaScript内置的一些特殊的单词,用来规定语法(Syntax),告诉JavaScript编译器要执行的操作。关键字和变量a中间的空格是必需的。
2.标识符
代码中给变量起的名字a叫作标识符(Identifier),是开发者给变量、函数、类等起的名字。标识符不能跟JavaScript中的保留字(Reserved Words)同名,因为保留字是JavaScript内部需要使用的,用于规定语法、程序结构或特殊用途。关键字中的大部分都属于保留字。目前ECMAScript中常见的保留字有await、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、export、extends、false、finally、for、function、if、import、in、instanceof、new、null、return、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
在ECMAScript规范中,还规定了一系列目前没有用到,但是未来有可能会用到的保留字,它们现在没有特殊的意义,但是随着ECMAScript规范的更新,会逐渐给它们附加功能。这些保留字仍然不能作为标识符,它们为abstract、boolean、byte、char、double、final、float、goto、int、long、native、short、synchronized、throws、transient、volatile。
3.运算符
a后边的等号是运算符(Operator),与常见的数学运算符类似,这里用它把数值5赋给变量a。等号前后的空格是JavaScript编码风格所建议的,是可选的,如果去掉并不影响程序的执行,不过这样的留白会在视觉上引起放松的效果,如果对于满篇的代码都省略了不必要的空格,则看起来密密麻麻很不舒服。
4.字面值
在JavaScript中,有数字、字符串、对象等不同的数据类型,不同的数据类型有不同的定义语法和可以对其进行的操作,数据类型对应的具体的值叫作字面值(Literal),例如示例中的5是数字类型的字面值,"hello"是字符串类型的字面值,true是布尔类型的字面值。由于JavaScript是动态类型语言,所以在定义变量时无须指定关键字,可以完全根据字面值的定义来确定值的类型。例如单纯地写上1则为数字类型,但是加上双引号"1"之后就会变为字符串类型了。
5.表达式
表达式(Expression)跟数学意义上的表达式类似,是指能计算并返回结果的代码。字面值一般是表达式,在浏览器控制台或代码中如果只写一个字面值,则它的返回结果就是它本身,如图2-1所示。
图2-1 在浏览器控制台编写表达式
可以看到控制台自动打印出了字面值的返回结果10,因为字面值有返回结果,所以它是表达式。同理示例“let a=5;”中的5是一个表达式,它的返回结果被保存到了变量a中。另外常见的数学计算,例如5+6也是表达式,它计算出的结果为11。
6.分号
在示例的最后是一个分号,代表一行代码的结束。分号是可选的,不过一般推荐在每行代码结束时写上分号,因为如果没有写分号,则JavaScript会根据情况把下一行代码也当作本行代码的延续,即视为同一行代码。这种情况很容易造成一些问题,这些问题会在后边的章节中遇到。
7.注释
除了一般的代码结构外,还有一种叫作注释(Comment),用来给代码添加说明,注释中可以是任何内容,不过要注意不能跟注释定义语法起冲突。注释会被编译器自动忽略,不会影响其他代码的执行。注释的存在是为了帮助不同的开发者理解各自所写的代码,也可以帮助自己在回顾代码时,回忆此段代码的作用,有的工具还会利用注释生成API文档。
JavaScript定义注释有3种方式。第1种是单行注释,使用两个斜杠//,这种只能把注释写在一行,目的是对某行或某段代码进行简单说明,它可以写在每行代码的后边,也可以写在上边。一般建议是,如果代码比较长,或者当对整段代码进行注释时,把注释写在上方;如果是对一行比较简短的代码进行说明,或者标注执行结果时,则可以写在该行代码的后边。代码如下:
//chapter2/comment1.js let num=10;//定义底数 //当条件成立时,进行XXX计算 if(someCondition&&otherCondition){ //XXX计算 }
示例中在代码“let num=10;”后边编写了一行注释,说明该行代码用于定义幂运算的底数,而if上边的注释则表示这段分支语句在某个条件下会执行什么计算。当然//XXX计算这一行注释是说示例中省略了相关的业务代码,单纯地展示注释的用法。
第2种是多行注释,用于注释内容比较长,一行占不下的情况,使用/**/定义。代码如下:
//chapter2/comment2.js /* *下边这段代码主要做了如下操作 * 1.XXX操作 * 2.YYY操作 */ //代码
第3种是文档注释,用于生成API接口文档,API文档是代码的说明书,用于给其他开发者查阅。文档注释描述了此应用程序暴露出来的,包括但不限于函数、对象、常量等的意义和用法。一般地,对于变量、常量等会直接编写它们的意义和用法,而对于函数则会编写较多的说明,例如函数的作用,接收的参数名字、数量、类型,返回值,在什么情况下会异常等。文档注释使用/***/定义,代码如下:
//chapter2/comment3.js /** *用于对两个数字进行相加计算 *@param{number}a *@param{number}b *@returns a与b的和 */ function sum(a,b){ return a+b; }
示例中第1行描述了该函数的作用,并使用@param语法描述参数,{number}用于指定要接收的参数类型,后边的a和b则是参数的名字,@returns用于描述函数的返回值。
这样编写文档注释之后,还可以让代码编辑器(例如VS Code)生成代码提示。定义好上方的注释之后,在VS Code中用鼠标指向函数时,或者调用函数时,可以看到函数的说明,这样就很方便地知道这个函数的用法了,如图2-2所示。
图2-2 文档注释
对于文档注释更多的使用方法,可以参考网上的教程,本书就不再赘述了。
多行注释和文档注释由于有开始和结束符号,例如/**和*/,所以要注意在注释内容中不能再出现*/字符,它会直接结束当前注释的定义,从而把后边的内容直接当作代码处理,这种处理方式会引发问题。例如在正则表达式中可以有*/符号,如果把它写在文档注释或多行注释中就会有问题,代码如下:
/*正则表达式:/abc.*/*/
这里*/在注释的正则表达式示例中提前结束了,后边的*/则不会被JavaScript识别,而会认为是不合法的符号从而抛出异常。
这些就是编写JavaScript程序的基本结构,随着章节的深入,还会遇到更多的语法、关键字和符号。现在明白这些结构后,就能够编写简单的代码了,接下来看一下编写程序最基本的单元:变量。