JavaScript基本语句有哪些?核心语法分类与示例解析

花开有时
花开有时
发布时间:2026-09-21 | 3人浏览过
原创

在编写 JavaScript 程序时,我们往往从“语句”开始构建逻辑。语句是程序执行的基本单位,它告诉引擎“做什么”。虽然现代开发中框架和库抽象了许多底层细节,但理解 if、for、let 这些基本语句的行为,依然是调试代码和优化性能的基础。建议初学者先掌握语句的分类逻辑,再深入具体语法,这样在面对复杂业务逻辑时,能更准确地选择控制结构。

声明语句:确立数据的存在

声明语句的作用是为变量、函数或类分配标识符,并可选地初始化值。它们不直接产生“动作”,而是为后续的动作提供上下文。

最基础的声明是 var、let 和 const。它们的区别不仅在于作用域,还在于提升(Hoisting)行为。var 声明的变量会被提升到函数顶部,而 let 和 const 存在暂时性死区(TDZ),在声明前访问会报错。

// var 的提升行为
console.log(a); // undefined
var a = 10;

// let 的暂时性死区
// console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 20;

var提升与let/const暂时性死区的执行顺序对比

var提升与let/const暂时性死区的执行顺序对比

函数声明同样具有提升特性,这使得我们可以在定义之前调用函数。相比之下,函数表达式(使用 const 或 let 赋值)则遵循变量的规则。

// 函数声明提升
sayHello(); // "Hello"
function sayHello() {
  console.log("Hello");
}

// 函数表达式无提升
// greet(); // TypeError: greet is not a function
const greet = function() {
  console.log("Hi");
};

表达式语句:执行计算与副作用

表达式语句是最常见的语句类型,它由一个表达式后跟分号组成。引擎会计算表达式的值,但通常我们关注的是其产生的“副作用”,如赋值、函数调用或属性修改。

一个简单的赋值操作就是典型的表达式语句:

let count = 0;
count = count + 1; // 表达式语句:计算右侧值并赋给左侧

函数调用也是表达式语句,即使我们不接收返回值,调用本身也会触发函数体内的逻辑执行。

console.log("Side effect"); // 输出到控制台是一个副作用
Math.random(); // 生成随机数,虽未赋值但已执行

需要注意的是,单独的常量或字面量虽然也是合法的表达式语句,但在严格模式下或实际工程中通常没有意义,甚至可能被优化器移除。

条件语句:基于布尔值的分支

当程序需要根据不同状态执行不同逻辑时,条件语句是首选。if...else 是最直观的结构,它根据条件的真假决定执行路径。

const score = 85;

if (score >= 90) {
  console.log("Excellent");
} else if (score >= 60) {
  console.log("Pass");
} else {
  console.log("Fail");
}

条件语句的执行路径分支示意

条件语句的执行路径分支示意

除了 if,switch 语句适用于多个固定值的匹配。它在处理枚举或状态码时比多层 if...else 更清晰,但需注意 break 的使用,否则会发生穿透(Fall-through)。

const status = "pending";

switch (status) {
  case "pending":
    console.log("Waiting for approval");
    break; // 防止穿透到下一个 case
  case "approved":
    console.log("Process started");
    break;
  default:
    console.log("Unknown status");
}

三元运算符 ? : 是 if...else 的简洁替代,适用于简单的值选择,但不建议嵌套使用,以免降低可读性。

循环语句:重复执行的机制

循环语句允许代码块重复执行,直到满足终止条件。for 循环是最常用的形式,特别适合已知迭代次数的场景。

for (let i = 0; i < 3; i++) {
  console.log(`Iteration ${i}`);
}

while 和 do...while 则适用于条件未知、需动态判断的场景。do...while 保证循环体至少执行一次,这在需要“先尝试后检查”的逻辑中非常有用,例如用户输入验证。

let input = "";
do {
  // 模拟获取输入
  input = getUserInput(); 
} while (!isValid(input));

传统索引循环与现代迭代循环的代码对照

传统索引循环与现代迭代循环的代码对照

在现代 JavaScript 中,for...of 循环常用于遍历数组、字符串或可迭代对象,它比传统的 for 索引循环更简洁且不易出错。

const colors = ["red", "green", "blue"];
for (const color of colors) {
  console.log(color);
}

跳转语句:改变执行流

跳转语句用于中断当前的执行流,包括 break、continue、return 和 throw。

break 用于立即退出循环或 switch 语句,而 continue 则跳过当前迭代的剩余部分,直接进入下一次迭代。合理使用 continue 可以减少嵌套层级,提高代码扁平度。

for (let i = 0; i < 10; i++) {
  if (i % 2 === 0) continue; // 跳过偶数
  if (i > 5) break; // 大于5则停止
  console.log(i); // 输出 1, 3, 5
}

return 语句用于结束函数执行并返回值。在异步函数中,return 还会包裹 Promise。

throw 用于抛出异常,中断正常流程并将控制权交给最近的 catch 块。这是错误处理的核心机制。

例外与进阶:何时不使用传统语句

虽然上述语句构成了 JavaScript 的基础,但在某些现代开发场景中,它们的使用方式发生了变化,甚至被替代。

首先是异步编程。在 async/await 出现之前,回调地狱使得控制流难以管理。现在,我们可以像写同步代码一样使用 try...catch 处理异步错误,但需要注意 await 必须在 async 函数中使用。

其次是函数式编程风格。在处理数组数据转换时,map、filter 和 reduce 等高阶函数往往比 for 循环更受青睐。它们避免了可变状态的管理,减少了副作用。

// 传统命令式
const squares = [];
for (let i = 0; i < nums.length; i++) {
  squares.push(nums[i] * nums[i]);
}

// 函数式声明式
const squares = nums.map(n => n * n);

最后,标签语句(Labeled Statements)允许 break 或 continue 跳出指定的外层循环。虽然语法支持,但由于极易导致代码混乱,现代规范强烈建议避免使用。

理解这些基本语句的规则与例外,能帮助我们在面对不同业务需求时,选择最恰当的表达方式,而不是机械地套用模板。代码不仅是给机器执行的指令,更是给人阅读的逻辑陈述。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表