1. 词法结构
编程语言的词法结构是一套基本规则,规定了如何使用这门语言编写程序。词法结构是一门语言最低级的语法,规定了变量如何命名、注释的定界符,以及如何分割成小的语句等等。描述
主要词法结构的内容有:
- 区分大小写、空格和换行符
- 注释
- 字面量
- 标识符和保留字
- Unicode
- 可选的分号
1.1 区分大小写、空格和换行符
区分大小写:关键字、变量、函数名和其他标识符必须始终保持一致的大小写形式。例如,online、onLine、OnLine和ONLINE是四个完全不同的变量名。
JavaScript忽略空格和换行符,可随意使用空格和换行符。在写代码时规范空格锁进和换行只是为了便于阅读和美观。
除了常规空格(\u0020),制表符、各种ASCII控制符和Unicode间格识别为空格。把换行符、回车符和回车/换行序列识别为终止符。
1.2. 注释
JavaScript支撑两种注释:单行注释和多行注释
单行注释:
// 以//开头到一行末尾的单行注释
/* 这是另一个注释 */
多行注释:位于/ 和/之间,可跨行,但不能嵌套
/*
* 多行注释
* 每行额外的*不是必需的,只是为了美观
*/
1.3 字面量
字面量(literal)是一种直接出现在程序中的数据值。
12 // 数值
true // 布尔值
'你好' //字符串
null // 无对象
1.4 标识符和保留字
标识符是我们在声明常量、变量、属性、函数和类时取的名字。
标识符的规范:须以字母、下划线(_)或美元符号$开头,后续字符可以是字母、数字、下划线或美元符号。(数字不能作为第一个字符,以便JavaScript区分标识符和数值)
保留字是JavaScript内置的标识符,最好不要作为常规标识符使用。
as const export get null target void
async continue extends if of this while
await debugger false import return throw with
break default finally in set true yield
case delete for instanceof static try
catch do from let super typeof
class else function new switch var
enum implements interface package private protected public
arguments eval
1.5 Unicode
JavaScript程序是使用Unicode字符集编写的。建议在标识符中只使用ASCII字母和数字,便于编辑。
1.5.1 Unicode转义序列
JavaScript定义了转义序列,实现仅使用ASCII字符来表示Unicode,以便老系统能够输入或正确处理全部Unicode字符。
Unicode转义序列以\u开头,后跟十六进制数字4位(包括大写或小写的字母A-F)或包含在一对花括号内的1-6位十六进制数字。
// 字符“é”的Unicode转义序列是 \u00e9 ,三种使用示例
let café = 1 // 使用Unicode字符定义一个变量
caf\u00e9 // => 1,使用转义序列访问这个变量
caf\u{e9} // => 1, 相同转义序列的另一种形式(ES6新增,带花括号,为了更好支持大于16位的Unicode码点,比如表情符号)
1.5.2 Unicode归一化
Unicode允许多种编码方式表示同一个字符。虽然不同编码方式的字符看起来一样,但它们的二进制编码不同,JavaScript认为它们是不同的。
JavaScript假定自己解释的源代码已经归一化,不会再执行任何归一化。这些需要我们保证使用自己的编辑器对源代码执行Unicode归一化。
1.6 可选的分号
- JavaScript使用分号(;)分隔语句。
- 如果两条语句分别写在两行,通常可以省略它们之间的分号
- 有些时候不能省略分号,不然JavaScript会把两行的语句解释为同条语句。通常,如果语句以(、[、/、+或-开头,有可能被解释为之前语句的一部分。这种情况最好语句结束后面加上分号。
对换行符的解释有三种例外情况:
- 第一种:像return、throw、yield、break和continue居于经常独立存在,会把后面的换行符解释为分号。一定不能再这些关键字和后面的表达式之间加入换行符
- 第二种:++和—操作符必须与自己操作的表达式位于同一行
- 第三种:使用箭头函数, 箭头=> 必须跟参数列表在同一行