总结
JavaScript 的所有元素区分大小写,例如:const x = 0; const X = 0; 定义了两个不同的变量;CONST x = 0; 会导致语法错误。
单行注释以 // 开头。多行注释用 /* */ 包围。
语句末尾的分号是可选的——只有少数几种情况需要强制使用。
变量名的第一个字符不能是数字:const 1x = 0; 会导致语法错误。

区分大小写
JavaScript 是区分大小写的。这意味着所有关键字、变量名和函数名必须保持一致。例如,创建函数 Hello() 与函数 HELLO()hello()hEllo() 是不同的。或者,IF (x > 0) { } 会导致语法错误,因为关键字 if 必须小写。

空格
空格包括空格、制表符和换行符[注1]。如果存在多个空格,JavaScript 会将它们压缩为一个空格,例如:' ' -> ' ''\n\t' -> '\n'。这个剩下的单一空格用于将语言元素(如关键字和变量名等)彼此分隔开。最终的源代码对人类来说较难阅读[2],但对浏览器来说(稍微)更容易解析。其主要优点是代码的大小更小,减少了在服务器和客户端之间传输的数据量。

以下是一个空格较少的脚本示例:

function filterEmailKeys(event){
  event=event||window.event;
  const charCode=event.charCode||event.keyCode;
  const char=String.fromCharCode(charCode);
  if(/[a-zA-Z0-9_\-\.@]/.exec(char)){return true;}
  return false;
}

以下是同一个脚本,添加了典型的空格:

function filterEmailKeys(event) {
  event = event || window.event;
  const charCode = event.charCode || event.keyCode;
  const char = String.fromCharCode(charCode);
  if (/[a-zA-Z0-9_\-\.@]/.exec(char)) {
    return true;
  }
  return false;
}

以下是同一个脚本,添加了很多空格:

function filterEmailKeys( evt ) {

    evt = evt || window.event;

    const charCode = evt.charCode || evt.keyCode;
    const char = String.fromCharCode ( charCode );

    if ( /[a-zA-Z0-9_\-\.@]/.exec ( char ) ) {
        return true;
    }

    return false;
}

注释
注释是源代码的一部分,根据定义,它们不会被执行。
注释允许你在代码中留下便条,帮助其他人理解代码。它们还允许你注释掉一些你不希望被解析器处理的代码,但又不想删除它们。

单行注释
双斜线 // 会把同一行中的所有文本转换为注释,JavaScript 解释器不会处理这些文本。

// 显示欢迎信息
alert("Hello, World!");

多行注释
多行注释以 /* 开始,以 */ 结束。多行注释不能嵌套。

以下是如何使用不同类型的注释技巧的示例:

/* 这是一个多行注释
包含了多行注释文本。 */
let a = 1;

/* 注释掉的代码用于进一步测试
a = a + 2;
a = a / (a - 3); // 这里有什么问题吗?
*/
alert('a: ' + a);

/* 这个注释有两个 /*,但它们都被 */ 取消了 */

分号(Semicolons)

在许多编程语言中,语句的末尾需要加上分号。JavaScript 中,分号的使用是可选的,因为新的一行通常表示语句的结束(但有一些例外)。这种机制被称为自动分号插入(Automatic Semicolon Insertion)。

例如,下面的代码:

x = a + b;

与以下代码是等效的:

x = a + b

然而,某些例外情况可能会导致意外的行为。自动分号插入有时会产生难以调试的问题。例如,下面的代码:

a = b + c
(d + e).print()

JavaScript 并不会将这段代码解释为两个独立的语句。由于第二行的圆括号,JavaScript 会将它解释为:

a = b + c(d + e).print();

这显然不是开发者的本意,开发者可能希望这段代码被解释为:

a = b + c;
(d + e).print();

因此,尽管分号是可选的,为了避免误解,最好在语句末尾加上分号。

字面量(Literals)

字面量是硬编码的值,它们为表达特定值提供了一种方式。例如,等号右侧的内容:

const myLiteral = "a fixed value";

JavaScript 中有几种常见的字面量类型,包括字符串字面量、数字字面量、布尔值、undefinednull、正则表达式字面量、数组字面量和对象字面量。

例如:

const myObject = { name:"value", anotherName:"anotherValue" };
const isClosed = true;
const mayBeWrong = "true";

这些不同类型的字面量在 变量与类型 部分会有更详细的介绍。

标识符(Identifiers)

标识符是数据的名称,例如变量、数组或函数。标识符有一些规则:

  • 标识符可以包含字母、美元符号、下划线和数字。
  • 标识符的第一个字符不能是数字。

以下是有效标识符的示例:

u
$hello
_Hello
hello90

1A2B3C 不是有效标识符,因为它以数字开头。

标识符的例子包括变量名,它们遵循上述规则:

  • 可以使用大写字母、小写字母、下划线和美元符号。
  • 数字可以出现在第一个字符之后。
  • 可以使用非拉丁字符(例如 "á")作为变量名,只要它们具有 Unicode 属性 "ID_Start"(作为名称的起始字符)或 "ID_Continue"(作为名称的其余部分)。
  • 特殊字符是不允许的。
  • 变量名是区分大小写的:不同的大小写意味着不同的名称。
  • 变量名不能是保留字。

练习(Exercises)

练习内容可以在另一个页面查看(点击此处)。

注释(Notes)

  • 从技术上讲,垂直制表符、零宽不换行空格和任何具有 "Space Separator" 类别的 Unicode 字符也算作空白字符。

参考文献(References)

  • ECMAScript 语言规范,第12.2章 - 空白字符
  • Khan Academy
  • ECMA-262 ECMAScript 语言规范,第12.9章 - 自动分号插入
  • ECMAScript 语言规范,IdentifierName 生产
Last modified: Monday, 13 January 2025, 3:01 PM