JavaScript编程
总结
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 中有几种常见的字面量类型,包括字符串字面量、数字字面量、布尔值、undefined
、null
、正则表达式字面量、数组字面量和对象字面量。
例如:
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 生产