JavaScript 语句机制详解
JavaScript 中的语句以分号结尾,用于执行特定操作。表达式是求值产生结果,而语句则是让某件事发生。赋值、函数调用等具有副作用的表达式可以单独作为语句使用,称为表达式语句。程序由一系列语句构成,默认按顺序执行,但可以通过条件、循环和跳转语句改变执行流程。
1. 表达式语句
常见的表达式语句包括:
- 赋值操作:如
x = 10、y++ delete操作:用于删除对象属性- 函数调用:如
console.log("hello")
2. 复合语句与空语句
复合语句
用花括号 {} 将多条语句包裹起来,形成一条复合语句。复合语句结尾不需要分号。注意:在块内声明的变量并不会限制在该块的作用域内。
{
let a = 1;
let b = 2;
// 这里 a 和 b 在块外仍可访问
}
空语句
空语句包含零条语句。如果特意使用空语句,建议添加注释说明意图:
// 初始化数组,使用空语句
for(let i = 0; i < arr.length; arr[i++] = 0) /* 空语句 */;
3. 声明语句
var 声明
var 用于声明一个或多个变量。声明的变量不可通过 delete 删除,初始值为 undefined。多次声明同一变量不会报错。
var x = 5, y = 10;
函数声明
使用 function 关键字声明函数,格式为:
function functionName(参数1, 参数2) {
// 函数体
}
花括号是必需的。函数声明在嵌套时只能位于外层函数顶部,不能出现在 if 或 while 等语句块中。与函数定义表达式不同,函数声明会将函数名和函数体同时提升至作用域顶部,因此可以在声明之前调用。
4. 条件语句
if 语句
基本形式:if (条件) { ... }。支持 else 和 else if 分支。
switch 语句
switch(val) {
case 1:
// 匹配 val === 1
break;
case 2:
// 匹配 val === 2
break;
default:
// 默认分支
}
匹配使用严格相等 ===,不进行类型转换。在函数内可以用 return 替代 break。default 分支可放在任意位置。case 后可以是任意表达式,但应避免有副作用的表达式。
5. 循环语句
while 循环
while (条件) {
// 循环体
}
do...while 循环
do {
// 循环体
} while (条件);
for 循环
for (初始化; 条件; 递增) {
// 循环体
}
三个部分均可省略,但分号必须保留。死循环写法:for(;;){ }。注意 continue 在 for 和 while 中的行为差异。
for...in 循环
for (let key in obj) {
// 遍历 obj 的可枚举属性
}
若 object 为 null 或 undefined 则跳过循环;若为原始值则自动包装。该循环只枚举可枚举属性。属性遍历顺序通常按定义顺序,但继承属性、数组索引属性或删除操作可能影响顺序。
6. 跳转语句
标签语句
格式:标签名: 语句。标签标识符不能是保留字,且与变量或函数名不冲突。标签在其作用语句内有效,但嵌套的标签不能重名。
outer: for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
if (i === 2) break outer;
}
}
break
用于退出循环或 switch。可与标签配合跳出多层循环。
continue
跳过本次循环剩余部分,进入下一次迭代。同样支持标签。
return
从函数返回值,只能在函数体内使用。
throw
显式抛出异常,通常使用 Error 类型或其子类型:
throw new Error("错误信息");
try/catch/finally
try {
// 可能抛出异常的代码
} catch (e) {
// 处理异常
} finally {
// 总是执行的代码
}
7. 其他语句
- with:临时扩展作用域链,但可能引起混淆且不利于性能,建议避免使用。
- debugger:在支持调试的环境下产生断点。
- "use strict":启用严格模式,适用于脚本或函数作用域。