词法
大凡语言,不管是人类使用的自然语言还是计算机使用的程序语言,基本单位都是一个个的单词,不同的语言有着不同的单词库和构词规则,即为词法。
本文基于ECMAScript5语言规范对JavaScript语言的词法进行说明。
概述
如下例所示,程序的源代码由字符序列构成。
console.log("the program is running");
字符序列可以分解成由分隔符号分隔的一组标记(token)序列。 标记(Token)相当于自然语言中的单词,是程序构成元素中的最小有意义单元。 标记(Token)再组合成表达式、语句以至整个程序。
JavaScript中的标记(token)可以分为以下几种类型:
- 标识符
- 常数
- 运算符号
- 分隔符号
- 关键字
上面这段代码在词法分析中即会被分解成以下多个标记(Token):
序号 | 标记(Token) | 说明 |
---|---|---|
1 | console | 变量标识符 |
2 | . | 点运算符 |
3 | log | 方法名标识符 |
4 | ( | 括号运算符 |
5 | “the program is running” | 字符串常数 |
6 | ) | 括号运算符 |
7 | ; | 分隔符 |
下面我们先介绍一下JavaScript语言的字符集以及注释的格式,然后再对上面的各类标记(token)分别进行说明。
字符集
字符集定义了程序源代码所能使用字符的一个集合。 JavaScript程序内部采用Unicode字符集、其脚本文件需保存为utf8格式。
注释
注释用来在源码中增加解释性的信息,可以帮助阅读和理解源码。 有两种生成注释的方法。
- 第一种是单行注释,使用//
,会将该行中符号以后的文本都视为注释。
- 第二种是多行注释,使用/* */
,其包括的文本无论是否跨行都视为注释。
注释本身通常并不作为标记进行处理。
标识符
标识符就是一个名字,用来对变量、常量、函数以及类型等进行命名。
标识符可以包含以下文字,但第一个文字必须是字母、下划线(_)或者美元($)符号,字母大小写区分。
- 大写字母(A~Z)
- 小写字母ト(a~z)
- 数字(0~9)
- 符号($、_)
- Unicode转义序列
常数
常数是直接记述在源代码中的值对象,包含以下分类:
分类 | 定义 | 例 |
---|---|---|
整数常数 | 整数值,可以是10进制、8进制、16进制或2进制形式。 | 123、-93、+456、0xff |
浮点数常数 | 实数值,可以是指数形式 | 123.23、-93.22、6.022e3 |
字符串常数 | 由双引号(“)对或单引号(‘)对包围的零个或多个字符。 | ”abc3d3”、'开发' |
布尔值常数 | 真伪值,只有两个:true或false。 | true,false |
正则表达式常数 | 正斜杠“/”围成的表达式。 | /ab+c/g |
空常数 | 空值,只有一个:null。 | null |
运算符
运算符号是表示运算的一类特殊符号,例如,加号与乘号。运算符操作的值称为运算对象。 运算符号包含以下分类:
分类 | 运算符 | 用途 | 例 |
---|---|---|---|
赋值 | = | 赋值 | x=2 |
+= | 加赋值 | x |
|
-= | 减赋值 | x-=2 | |
*= | 乘赋值 | x*=2 | |
/= | 除赋值 | x/=2 | |
%= | 模赋值 | x%=2 | |
&= | 按位与赋值赋值 | x&=2 | |
|= | 按位或赋值 | x|=2 | |
^= | 按位异或赋值 | x^=2 | |
<<= | 左移赋值 | x«=2 | |
>>= | 右移赋值 | x»=2 | |
>>>= | 无符号右移赋值 | x*=2 | |
算术 | + | 加法 | 3+4 |
- | 减法 | 3-4 | |
* | 乘法 | 3*4 | |
/ | 除法 | 3/4 | |
% | 取余 | 3%4 | |
++(前) | 自增 | ++x | |
++(后) | 自增 | x++ | |
--(前) | 自减 | –x | |
--(后) | 自减 | x– | |
- | 一元求反 | -x | |
- | 一元正号 | +x | |
关系 | == | 等于 | x==y |
!= | 不等于 | X!=y | |
< | 小于 | x<y | |
> | 大于 | x>y | |
<= | x⇐y | ||
>= | 大于等于 | x>=y | |
=== | 严格相等运算符 | x===y | |
!== | 严格非相等运算符 | x!==y | |
逻辑 | || | 逻辑或 | x||y |
&& | 逻辑与 | x&&y | |
! | 逻辑非 | !x | |
位 | & | 按位AND | x&y |
| | 按位或OR | x|y | |
^ | 按位亦或XOR | x^y | |
~ | 按位非NOT | ~x | |
<< | 左移 | x< | |
>> | 右移 | x>>y | |
>>> | 右移 | x>>>y | |
其他 | ?: | 条件运算符 | x>y?3:4 |
, | 逗号 | var x=3,y=4; | |
. | 点运算符的左边是一个对象,右边是其成员 | console.log(“a”) | |
() | 括号运算符 | (3+4)*2 | |
[] | 中括号运算符 | obj[“method1”]() |
分隔符号
分类 | 绑定或符号 | 用途 | 例 |
---|---|---|---|
结束 | ;(分号) | 语句的结束 | - |
关键字
以下关键字都是保留字,不可用于变量,常量,函数,方法,或对象的标识符。
break | finally | this |
case | for | throw |
catch | function | try |
continue | if | typeof |
debugger | in | var |
default | instanceof | void |
delete | new | while |
do | return | with |
else | switch | - |