引子
本章主要介绍 ECMAScript 语法规范 与 严格模式,另外还有 关键字的禁忌
任何语言的核心所描述的都是这门语言在最基本的层面上如何工作,涉及语法、操作符、数据类型以及内置功能,在此基础之上才可以构建复杂的解决方案;ECMA-262以一个名为 ECMAScript 的伪语言的形式,定义了 JavaScript 的所有这些方面。
语法
ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C 语言,如 Java 和 Perl。
区分大小写
ECMAScript 中一切都区分大小写。无论是变量、函数名还是操作符,都区分大小写。换句话说,变量 test 和变量 Test 是两个不同的变量。类似地,typeof 不能作为函数名,因为它是一个关键字,但 Typeof 是一个完全有效的函数名。
标识符
所谓标识符,就是变量、函数、属性或函数参数的名称。
标识符可以由一或多个下列字符组成:第一个字符必须是一个字母、下划线(_)或美元符号($);剩下的其他字符可以是字母、下划线、美元符号或数字。标识符中的字母可以是扩展 ASCII(Extended ASCII)中的字母,也可以是 Unicode 的字母字符。
ECMAScript 标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的首字母大写,如:firstList,oneNav,newTodoList ;虽然这种写法并不是强制性的,但因为这种形式跟 ECMAScript 内置函数和对象的命名方式一致,所以算是最佳实践。
注意: 关键字、保留字、true、false 和 null 不能作为标识符。
注释
ECMAScript 采用 C 语言风格的注释,包括单行注释和块注释。
windos 快捷键为ctrl+/;mac 快捷键为 Command+/
单行注释
两个斜杠字符(//)开头,如:
// 我是单行注释
块注释
一个斜杠和一个星号(/*)开头,以它们的反向组合 (*/)结尾,如:
/* 我是多行注释 */
严格模式
ECMAScript 5 增加了严格模式(strict mode)的概念
严格模式是一种不同的 JavaScript 解析和执行模型,ECMAScript 3 的一些 不规范写法在这种模式下会被处理,对于不安全的活动将抛出错误。
使用写法
要对整个脚本启用严格模式,在脚本开头加上这一行:
"use strict";
虽然看起来像个没有赋值给任何变量的字符串,但它其实是一个预处理指令。任何支持的 JavaScript引擎看到它都会切换到严格模式。选择这种语法形式的目的是不破坏 ECMAScript 3 语法。
也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可,如:
// 函数体
function doSomething() {
"use strict";
}
严格模式会影响 JavaScript 执行的很多方面,如今所有现代浏览器都支持严格模式。
语句
ECMAScript 中的语句以分号结尾。
省略分号意味着由解析器确定语句在哪里结尾,如下:
let sum = a + b // 没有分号也有效,但不推荐
let diff = a - b; // 加分号有效,推荐
即使语句末尾的分号不是必需的,但也应该加上。记着加分号有助于防止省略造成的问题,比如可以避免输入内容不完整。此外,加分号也便于开发者通过删除空行来压缩代码(如果没有结尾的分号,只删除空行,则会导致语法错误)。
加分号有助于在某些情况下提升性能,因为解析器会尝试在合适的位置补上分号以纠正语法错误
代码块
代码块由一个左花括号({)标识开始,一个右花括号(})标识结束,如下:
if (test) { // 开始
test = false;
console.log(test);
} // 结束
在控制语句中使用代码块可以让内容更清晰,在需要修改代码时也可以减少出错的可能性
关键字与保留字
ECMA-262 描述了一组保留的关键字,这些关键字有特殊用途,比如表示控制语句的开始和结束,或者执行特定的操作。按照规定,保留的关键字不能用作标识符或属性名。
ECMA-262 第 6 版规定的所有关键字如下(会简单说明用处):
| break(返回) | do(循环) | in(包含) | typeof(类型检测) |
|---|---|---|---|
| case(循环) | else(判断) | instanceod(检测) | var(声明变量) |
| import(模块) | export(模块输出) | new(对象) | void(运算符) |
| class(类) | extends(类) | return(返回) | while(循环) |
| const(声明变量) | finally(回调) | super(继承) | with(取值) |
| continue(返回) | for(循环) | switch(循环) | yield(生成器) |
| debugger(停止) | function(函数) | this(指针) | default(默认) |
| if(判断) | throw(检测) | catch(捕获错误) | try(捕获异常) |
规范中也描述了一组未来的保留字,同样不能用作标识符或属性名。虽然保留字在语言中没有特定用途,但它们是保留给将来做关键字用的。
以下是 ECMA-262 第 6 版为将来保留的所有词汇。
始终保留:
enum
模块代码中保留:
await
严格模式下保留:
| implements | package |
|---|---|
| public | interface |
| protected | static |
| let | private |
这些词汇虽然不能用作标识符,但现在还是可以用作对象的属性名。
最好还是不要使用关键字和保留字作为标识符和属性名,以确保兼容过去和未来的
ECMAScript版本。
总结
- 语法区分大小写,采用驼峰写法
- 单行注释两个斜杠字符(
//)开头,多行注释一个斜杠和一个星号(/*)开头结尾 - 严格模式是一种不同的 JavaScript 解析和执行模型, 规范代码风格