词法
大凡语言,不管是人类使用的自然语言还是计算机使用的程序语言,基本单位都是一个个的单词,不同的语言有着不同的单词库和构词规则,即为词法。
本文基于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 | - |