【JS红宝书⁰³】语法规范与严格模式

135 阅读5分钟

引子

本章主要介绍 ECMAScript 语法规范 与 严格模式,另外还有 关键字的禁忌

任何语言的核心所描述的都是这门语言在最基本的层面上如何工作,涉及语法、操作符、数据类型以及内置功能,在此基础之上才可以构建复杂的解决方案;ECMA-262以一个名为 ECMAScript 的伪语言的形式,定义了 JavaScript 的所有这些方面。

语法

ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C 语言,如 Java 和 Perl。

区分大小写

ECMAScript 中一切都区分大小写。无论是变量、函数名还是操作符,都区分大小写。换句话说,变量 test 和变量 Test 是两个不同的变量。类似地,typeof 不能作为函数名,因为它是一个关键字,但 Typeof 是一个完全有效的函数名。

标识符

所谓标识符,就是变量、函数、属性或函数参数的名称。

标识符可以由一或多个下列字符组成:第一个字符必须是一个字母、下划线(_)或美元符号($);剩下的其他字符可以是字母、下划线、美元符号或数字。标识符中的字母可以是扩展 ASCII(Extended ASCII)中的字母,也可以是 Unicode 的字母字符。

ECMAScript 标识符使用驼峰大小写形式,即第一个单词的首字母小写,后面每个单词的首字母大写,如:firstListoneNavnewTodoList ;虽然这种写法并不是强制性的,但因为这种形式跟 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

严格模式下保留:
implementspackage
publicinterface
protectedstatic
letprivate

这些词汇虽然不能用作标识符,但现在还是可以用作对象的属性名。

最好还是不要使用关键字和保留字作为标识符和属性名,以确保兼容过去和未来的ECMAScript 版本。

总结

  • 语法区分大小写,采用驼峰写法
  • 单行注释两个斜杠字符(//)开头,多行注释一个斜杠和一个星号(/*)开头结尾
  • 严格模式是一种不同的 JavaScript 解析和执行模型, 规范代码风格