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 解释器处理。
// Show a welcome message
alert("Hello, World!")
- 多行注释
多行注释以 /*
开头,并以相反的 */
结尾。多行注释不会嵌套。
以下是如何使用不同类型的注释技术的示例。
/* This is a multi-line comment
that contains multiple lines
of commented text. */
let a = 1;
/* commented out to perform further testing
a = a + 2;
a = a / (a - 3); // is something wrong here?
*/
alert('a: ' + a);
/* This comment has two /* but they're both canceled out by */
在许多编程语言中,每个代码语句的末尾都需要分号。在 JavaScript 中,分号的使用是可选的,因为换行符表示语句的结束(除了一些例外)。这被称为 自动分号插入。
// the line
x = a + b;
// is equivalent to:
x = a + b
但是,这些例外可能令人惊讶。[3] 自动分号插入可能会导致难以调试的问题。
a = b + c
(d + e).print()
上面的代码不会被解释为两个语句。由于第二行上的括号,JavaScript 会将上面的代码解释为
a = b + c(d + e).print();
而你可能本意是将其解释为
a = b + c;
(d + e).print();
即使分号是可选的,最好在语句末尾加上分号,以防止出现任何误解。
字面量是一个硬编码的值。字面量提供了一种在脚本中表达特定值的方法。例如,在等号右边
const myLiteral = "a fixed value";
有几种类型的字面量可用。最常见的是字符串字面量,但还有数字字面量、布尔值、未定义、空值、正则表达式字面量、数组字面量和对象字面量。
对象、布尔值和字符串字面量的示例
const myObject = { name:"value", anotherName:"anotherValue" };
const isClosed = true;
const mayBeWrong = "true";
这些不同类型的详细信息将在 变量和类型 中介绍。
标识符是数据片段(如变量、数组或函数)的名称。有一些规则
- 标识符中允许使用字母、美元符号、下划线和数字。
- 第一个字符不能是数字。
有效标识符的示例
u
$hello
_Hello
hello90
1A2B3C
是一个无效的标识符,因为它以数字开头。
“标识符”的一个例子是变量名。它们遵循这样的规则。
- 可以使用大写和小写字母、下划线和美元符号。
- 数字可以在第一个字符之后使用。
- 只要它们分别具有“ID_Start”或“ID_Continue”的 Unicode 属性,就可以在变量名中使用非拉丁字符(如“á”)。[4] 不允许使用特殊字符。
- 变量名区分大小写:不同的情况意味着不同的名称。
- 变量不能是保留字。
- ↑ ECMAScript 语言规范,第 12.2 章 - 空白符
- ↑ 可汗学院
- ↑ ECMA-262 ECMAScript 语言规范,第 12.9 章 - 自动分号插入
- ↑ ECMAScript 语言规范,IdentifierName 生成