词法结构的概念

  编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序。
  作为语法的基础,它规定了诸如变量名是什么样的、怎么写注释,以及程序语句之间如何分隔等规则。

字符集

范围(掌握)

  JavaScript 程序是用 Unicode 字符集编写的。Unicode 是 ASCII 和 Latin-1 的超集,并支持地球上几乎所有在用的语言。ECMAScript 3 要求 JavaScript 的实现必须支持 Unicode2.1 及后续版本,ECMAScript5 则要求支持 Unicode3 及后续版本。

联想延伸

  静态 String.fromCharCode() 方法返回使用指定的 Unicode 值序列创建的字符串。经常在浏览器的按键事件使用,可以把索引值(按键码)转化成该键对应的的字符。
例:下例返回字符串 "ABC"

String.fromCharCode(65, 66, 67);
1

  注意:该方法返回一个字符串,而不是一个 String 对象。
  由于 fromCharCode 是 String 的静态方法,所以应该像这样使用:String.fromCharCode(),而不是作为你创建的 String 对象的方法。
  由于高位编码字符是用两个低位编码(lower value)表示形成的一个字符,因此String.fromCodePoint() (ES6 规范的一部分)被用来返回这样一对低位编码,从而可以完全表示这些高位编码字符。

区分大小写(掌握)

  JavaScript 是区分大小写的语言。也就是说,关键字、变量、函数名和所有的标识符都必须采取一致的大小写形式,如果有一个字母大小写不相同就不是同一个,程序会抛出异常。

需要注意

  HTML 并不区分大小写(尽管 XHTML 区分大小写)。由于它和客户端 JavaScript 联系紧密,因此这点区别很容易混淆。
  许多客户端 JavaScript 对象和属性与它们所表示的 HTML 标签和属性同名。在 HTML 中,这些标签和属性名可以使用大写也可以是小写,而在 JavaScript 中则必须是小写。例如,在 HTML 中设置事件处理程序时,onclick 属性可以写成 onClick,但在 JavaScript 代码(或者 XHTML 文档)中,必须使用小写的 onclick。

空格、换行符(掌握)

  JavaScript 会忽略程序中标识之间的空格。多数情况下,JavaScript 同样会忽略换行符。但是有少数情况不会忽略,在下文会讲到。

Unicode 转义序列(了解)

  在有些老旧的计算机硬件和软件里,无法显示或输入 Unicode 字符全集。JavaScript 定义了一种特殊序列,使用 6 个 ASCII 字符来代表任意 16 位 Unicode 内码。这些 Unicode 转义序列均以\u 为前缀,其后跟随 4 个十六进制数(使用数字以及大写或小写的字母 A~F 表示)。
  这种 Unicode 转义写法可以用在 JavaScript 字符串直接量、正则表达式直接量和标识符中(关键字除外)。例如,如下两个 JavaScript 字符串是完全一样的:

"cafe"= = ="caf\uooe9"//.=> true
1

标准化(了解)

  Unicode 允许使用多种方法对同一个字符进行编码。比如,字符“é”可以使用 Unicode 字符\uooE9 表示,也可以使用普通的 ASCII 字符 e 跟随一个语调符\u0301。在文本编辑器中,这两种编码的显示结果一模一样,但它们的二进制编码表示是不一样的,在计算机里也不相等。Unicode 标准为所有字符定义了一个首选的编码格式,并给出了一个标准化的处理方式将文本转换为一种适合比较的标准格式,JavaScript 会认为它正在解析的程序代码已经是这种标准格式,不会再对其标识符、字符串或正则表达式作标准化处理。

注释(掌握)

  JavaScript 支持两种格式的注释。
  在行尾“/”之后的文本都会被 JavaScript 当做注释忽略掉的。。

//这里是单行注释
/*这里是一段注释*/ //这里是另一段注释
/*
 *这又是一段注释
 *这里的注释可以连写多行
 *但不能有嵌套的注释
 */
1
2
3
4
5
6
7

直接量(了解)

  所谓直接量,就是程序中直接使用的数据值。下面列出的都是直接量:

12; //数字
1.2; //小数
('hello world'); //字符串文本
('Hi'); //另一个字符串
true; //布尔值
false / //另一个布尔值
  javascript /
  gi; //正则表达式直接量(用做模式匹配)
null; //空
1
2
3
4
5
6
7
8
9

  具体类型讲解在后面章节。

标识符和保留字

标识符(掌握)

  标识符就是一个名字。在 JavaScript 中,标识符用来对变量和函数进行命名,或者用做 JavaScript 代码中某些循环语句中的跳转位置的标记.
  JavaScript 标识符必须以字母、下划线()或美元符($)开始。后续的字符可以是字母、数字、下划线或美元符(数字是不允许作为首字符出现的,以便 JavaScript 可以轻易区分开标识符和数字)。

特殊字符(了解)

  出于可移植性和易于书写的考虑,通常我们只使用 ASCII 字母和数字来书写标识符。然而需要注意的是,JavaScript 允许标识符中出现 Unicode 字符全集中的字母和数字。(从技术上讲,ECMAScript 标准也允许在标识符的首字符后面出现 Unicode 字符集中的 Mn 类、Mc 类和 Pc 类坪注 7)。由此,程序员也可以使用非英语语言或数学符号来书写标识符。

var sí=true;
var π=3.14;
1
2

保留字(了解)

  JavaScript 把一些标识符拿出来用做自己的关键字。因此,就不能再在程序中把这些关键字用做标识符了。值得注意的是,这些保留字中的一部分在 ES6 中已经使用了。此外,还有一些关键字在普通的 JS 代码中是合法的,但是在严格模式下是保留字。另外,JS 中内置了很多全局变量和函数,应当避免把他们的名字用作变量名和函数名。此处不做详细列出,自行搜索。

可选的分号(掌握)

  我见过很多初学者没有注意到这个问题,不知道 JavaScript 的分号大多情况是可以不写的,然后每次程序出错时,为了找出哪里没有分号,都看成“斗鸡眼”了,还浪费了时间。
  需要注意的是,JavaScript 并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript 才会填补分号。换句话讲(类似下面代码中的两处异常),如果当前语句和随后的非空格字符不能当成一个整体来解析的话,JavaScript 就在当前语句行结束处填补分号。
  这里有个知乎讨论,JavaScript 语句后应该加分号么?,这个semi 是一个自动加分号的工具,其中还介绍了 Eslint 如何自动加分号。不过我劝你还是加分号,能够减少很多不必要的麻烦,多活几年。。。

不能省略分号的情况(掌握)

  声明变量时特别注意!

a = 3;
b = 4;
var y = x + f(a + b).toString();
1
2
3

  通常来讲,如果一条语句以“(”、“[”、“/”、“+”或“-”开始,那么它极有可能和前一条语句合在一起解析。以“/”、“+”和“一”开始的语句并不常见,而以 “(”和“[”开始的语句则非常常见,至少在一些 JavaScript 编码风格中是很普遍的。有些程序员喜欢保守地在语句前加上一个分号,这样哪怕之前的语句被修改了、分号被误删除了,当前语句还是会正确地解析:

var x=0//这里省略了分号
;[x,x+1X+2].forEach(console.1og)//前面的分号保证了正确地语句解析
1
2

  return、break 和 continue 语句后面换行会自动插入分号,可以在结尾加{} 或(),代码写在其中这样会避免 return 设计错误。
  涉及“+ +”和“--”运算符的时候,如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同时“++”或“--”将会作为下一行代码的前缀操作符并与之一起解析。

x;
++y;
1
2

  这段代码将解析为“x;+ +y”,而不是“x++;y”。

TOC