购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 词法基础

JavaScript语法就是指构成合法的JavaScript代码的所有规则和特征的集合,它包括词法和句法。词法包括字符编码、命名规则、标识符、关键字、注释规则和特殊字符用法等。

3.1.1 字符编码

JavaScript程序使用Unicode字符集编写。Unicode是ASCII和Latin-1的超集,并支持几乎所有在用的语言。ECMAScript 3要求JavaScript实现必须支持Unicode 2.1及后续版本,ECMAScript 5则要求支持Unicode 3及后续版本。

在JavaScript程序中每个字符都使用两个字节来表示,这意味着用户可以使用中文来命名变量或函数名。

【示例】 启动Dreamweaver,新建文档,保存为test.html,在页面嵌入<script>标签,然后在该标签中输入下面代码,则可以正常执行,效果如图3-1所示。

图3-1 使用中文编写脚本运行效果

注意: 虽然ECMAScript v3标准允许Unicode字符出现在JavaScript程序的任何地方,但是在第1、2版本中,ECMAScript标准只允许Unicode字符出现在注释或者引号包含的字符串直接量中,其他地方必须使用ASCII字符集,在ECMAScript标准化之前,JavaScript通常是不支持Unicode编码的。所以,考虑到JavaScript版本的兼容性以及开发习惯,不建议读者使用汉字来命名变量或函数名。

提示: 由于JavaScript脚本一般都寄存在网页中,并最终由浏览器来解释,因此在考虑到JavaScript语言编码的同时,还要顾及嵌入页面的字符编码,以及浏览器支持的编码。一般建议保持页面字符编码与JavaScript编码一致,避免出现乱码现象。

3.1.2 大小写敏感

JavaScript严格区分大小写。为了避免输入错误,用户可以采用一致的字符大小写形式,例如,遵循习惯所有字符都采用小写形式,这样可以有效减少输入错误,不过有两点例外。

(1)定义JavaScript构造函数时,根据习惯对象名称的首字母应该大写。

【示例1】 下面脚本调用预定义的构造函数Date(),创建一个时间对象,最后把时间对象转换为字符串显示出来。

(2)如果遵循骆驼命名法或帕斯卡命名法,标识符中部分字符可以考虑以大写形式输入。

骆驼命名法就是在名称中每一个逻辑断点都有一个大写字母来标记,例如:

     printEmployeePaychecks();

如果使用下划线命名法,则可以按如下方式输入:

     print_employee_paychecks();

骆驼命名法比较流行,在许多函数库和Windows编程环境中使用相当普遍,而下划线命名法在C语言或者UNIX编程环境中使用比较普遍。

帕斯卡命名法与骆驼命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写。例如,下面就是帕斯卡命名法定义的变量。

     PrintEmployeePaychecks();

另外,还有匈牙利命名法,由于这种方法与字符大小写关系不是很大,这里就不再说明。

提示: 在过渡型HTML版本中,HTML标签名和属性名是不区分大小写的,标签属性可以以任意大小写形式输入,但是JavaScript脚本在访问DOM节点时是区分大小的,为了避免错误,应该统一标签名和属性名为小写形式。

【示例2】 下面的代码在部分早期浏览器中JavaScript有可能仅会获取第一个div元素的节点,而忽略掉第2、3个div元素节点。

     <div></div>
     <Div></Div>
     <DIV></DIV>
     <script>
     var div =document.getElementsByTagName("div")
     alert(div.length)
     </script>

3.1.3 标识符

标识符(identifier)表示名称的意思,JavaScript标识符主要包括变量名、函数名、参数名和属性名。合法的标识符命名应该注意如下几条规则,这些规则与C语系其他语言基本相同。

第一个字符必须是字母、下划线(_)或美元符号($)。

除了第一个字符外,其他位置字符可以使用字母、数字、下划线、美元符号。在ECMAScript v3中,用户可以使用完整的Unicode字符集来命名标识符,但是不建议使用。

标识符名称不能够与JavaScript关键字或保留字同名。

在ECMAScript v3版本中,可以在标识符中使用Unicode转义序列。例如,标识符a可以写成“\u0061”(Unicode转义序列),然后就可以在变量中使用这个转义序列代替字符本身。

【示例】 下面这两行代码中,先定义一个变量abc,变量abc中的a被转义序列表示,为变量abc初始化并在对话框中显示出来。

     var \u0061bc ="标识符abc(变量)中a字符的Unicode转义序列是\\u0061";
     alert(\u0061bc);

在书写时,转义序列不是很方便,一般很少这样使用,只有在特殊情况使用转义序列来传递或显示特殊字符,如JavaScript关键字、程序脚本等。

3.1.4 直接量

直接量(literal)是在程序中直接显示出来的值,如字符串、数值、布尔值、正则表达式、对象初始化、数组初始化等。

【示例】 下面几行代码分别定义了字符串、数值、布尔值、正则表达式、特殊值、对象和数组直接量。

3.1.5 关键字和保留字

ECMA-262描述了一组具有特定用途的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符。以下是ECMAScript的全部关键字,如表3-1所示。

表3-1 ECMAScript关键字

ECMA-262还描述了另外一组不能用作标识符的保留字。保留字就是在目前还没有任何特定的用途,但它们有可能在将来版本中被用作关键字。

☑ ECMAScript 5保留关键字:

class、const、enum、export、extends、import、super

☑ 在严格模式下,下面关键字是保留字:

implements、let、private、public、yield、interface、package、protected、static

☑ 在严格模式下,严格限制下面关键字用作变量名、函数名或参数名:

arguments、eval

☑ ECMAScript 3将Java的所有关键字都列为保留字,但ECMAScript 5放宽了限制。

如果希望代码能在基于ECMAScript 3实现的解释器上运行,应当避免使用这些关键字作为标识符,如表3-2所示。

表3-2 ECMAScript 3保留字

JavaScript预定义了很多全局变量和函数,应当避免把它们的名字用作变量名和函数名,如表3-3所示。

表3-3 JavaScript预定义全局变量和函数

JavaScript实现可能定义独有的全局变量和函数,每一种特定的JavaScript运行环境(客户端、服务器端等)都有自己的一个全局属性列表,这些都需要注意。

3.1.6 分隔符

空格、制表符、换行符、换页符等在JavaScript程序中被统称为分隔符,用来分隔代码中的各种记号(如标识符、关键字、直接量、注释等信息),在解析时,JavaScript会忽略这些分隔符。

由于JavaScript可以忽略标记之间的分隔符,因此用户可以在标记之间随意插入多个空格、制表符或换行符,以便对代码进行格式化显示,统一的版式会使整个程序看起来更直观、易读。

【示例1】 对于下面代码块:

     function toStr(a){return a.toString();}

可以使用如下任意格式进行排版:

或者:

或者:

用户可以根据阅读习惯自定义脚本的版式。一般JavaScript编辑器都会提供代码格式化功能,利用这些工具能快速排版JavaScript代码。

【拓展】 分隔符虽然无关紧要,但是有些分隔符是有意义的,请注意下面几个问题。

(1)分隔符虽然无实在意义,但是脚本中不能够缺少分隔符,特别是在标识符与关键字之间必须使用分隔符进行分隔,否则JavaScript会误认为它们是一个完整的标记而无法正确识别。

【示例2】 在下面语句中,把关键字function与标识符toStr连在一起,以及把关键字return与toString标识符连在一起都是不正确的:

     functiontoStr(a){returna.toString();}            //错误写法

在它们之间必须使用分隔符进行分隔:

     function  toStr(a){return  a.toString();}        //正确写法

(2)JavaScript解析器一般采用最长行匹配原则,并在此基础上忽略代码中的分隔符。所谓最长行匹配原则,就是在一行内如果能够正确解析,那么就在一行内进行解析,否则会继续读取下一行代码,直到能够被正确解析为止。因此,用户不能够无节制地使用换行符。

【示例3】 下面代码就会返回错误的信息。

这是因为return作为一个独立语句,JavaScript解析器可以正确解析它,虽然它后面没有分号来标识该句的结束,但是解析器在正确解析的前提下,会自动为其补加一个分号,以表示该句已经结束。最后解析的脚本就变成了如下样式:

出现这个错误的根源是因为分号不是JavaScript语句结束的唯一标志。很多时候,JavaScript会自动把换行符也看作是一句结束的标志。因此,当使用换行符时,应该防止类似错误的发生。上面代码的正确写法应该是:

(3)不能在标识符、关键字等名称内插入分隔符,否则JavaScript会误认为它们是两个独立的标记并进行解析。

【示例4】 在下面函数中,错误地使用空格把toString()方法分隔为两部分,则JavaScript会误认为它们是to关键字和String()自定义函数两个实词标记。

(4)如果分隔符位于字符串或者正则表达式直接量内,则JavaScript会认为它们是具有一定语义的字符并进行解析。

【示例5】 在下面代码中,变量a和b被赋予相同的字符串,但是变量b中间插入了空格,则比较结果发现它们是不相同的。

     var a ="空格、制表符和换行符";
     var b ="空格 、 制表符 和 换行符";
     alert((a==b).toString());                //返回false

3.1.7 注释

注释就是不被解析的语句行或段。JavaScript把位于“//”字符后一行内的所有字符视为注释信息,从而忽略掉。

【示例1】 下面几条注释语句可以位于代码段的不同位置,分别描述不同区域代码的功能。

在使用单行注释时,在“//”符号后面的同一行内就不要输入任何代码,否则都被视为注释文本而忽略掉。

【示例2】 还可以使用“/*”和“*/”符号来包含多行注释信息。例如:

     /*
     多行注释
     多行注释
     */

在多行注释中,包含在“/*”和“*/”符号之间的任何文本都视为注释文本而忽略掉。

3.1.8 转义序列

在有些计算机硬件和软件中,无法显示或输入Unicode字符全集。为了支持那些使用老旧技术的程序员,JavaScript定义了一种特殊序列,使用6个ASCII字符来代表任意16位Unicode内码。

这些Unicode转义序列均以\u为前缀,其后跟随4个十六进制数,即使用数字以及大写或小写的字母A~F表示。这种Unicode转义写法可以用在JavaScript字符串直接量、正则表达式直接量和标识符中,但关键字除外。

【示例】 字符“码”的Unicode转义写法为\u7801,如下面两个JavaScript字符串是完全一样的。

     document.write("字符编码");
     document.write("字符编\u7801");

Unicode转义写法也可以出现在注释中,但由于JavaScript会将注释忽略,它们只是被当成上下文中的ASCII字符处理,而且并不会被解析为其对应的Unicode字符。 Z1WxSuH2RAN8g6EJ8adPGGLIJB2CSIQCrMyh6W2lXkIrCobB1G5PgMGdK7TOllct

点击中间区域
呼出菜单
上一章
目录
下一章
×