1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. 语句和声明
  5. 表达式语句

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

表达式语句

表达式语句是指在需要语句的地方使用的表达式。该表达式被执行后,它的结果将被丢弃——因此,它仅对有着副作用的表达式有意义,例如执行函数或者更新变量。

语法

js
expression;
expression

要计算的任意表达式有些表达式可能与其他语句产生歧义,因此被禁用。

描述

除了专用的语句语法外,你也可以将几乎任何表达式用作单独的语句。表达式语句语法需要在表达式的结尾添加一个分号,但是如果缺少分号导致语法无效,自动分号补全的过程可能会为你插入一个分号。

因为表达式执行之后就会被丢弃,表达式的结果不再可用。因此,表达式必须有一些副作用才能有用。表达式语句通常是:

如果表达式调用 getter 或者触发强制类型转换,它们也可能有副作用。

被禁用的表达式

为了将表达式用作语句,它禁止与其他的语句语法有歧义。因此,表达式禁止以以下任何标记开头:

因此,以下所有内容均无效:

js
function foo() {
 console.log("foo");
}(); // SyntaxError: Unexpected token '('
// 出于某种原因,你有一个叫做 `let` 的变量
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
 foo: 1,
 bar: 2, // SyntaxError: Unexpected token ':'
};

更危险的是,有时候代码碰巧是有效的语法,但是这并不是你想要的。

js
// 出于某种原因,你有一个叫做 `let` 的变量
var let = [1, 2, 3];
function setIndex(index, value) {
 if (index >= 0) {
 // 打算分配给数组 `let`,但是却创建一个额外的变量!
 let[index] = value;
 }
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// 这并不是一个对象字面量,而是一个块语句。
// 其中 `foo` 是标签,`1` 是表达式语句。
// 这通常在控制台中发生
{ foo: 1 };

为了避免这些问题,你可以使用圆括号,使语句明确地作为一个表达式。

js
(function foo() {
 console.log("foo");
})();

示例

避免控制流语句

你可以使用表达式语句来避免几乎所有控制流语句的使用。例如,可以使用三元运算符逻辑运算符替换 if...else。像 for 或者 for...of 可以使用数组方法来替换。

js
// 使用控制流语句
function range(start, end) {
 if (start > end) {
 [start, end] = [end, start];
 }
 const result = [];
 for (let i = start; i < end; i++) {
 result.push(i);
 }
 return result;
}
// 使用表达式语句
function range2(start, end) {
 start > end && ([start, end] = [end, start]);
 return Array.from({ length: end - start }, (_, i) => start + i);
}

警告:这仅演示了该语言的功能。过度的使用表达式语句来替代控制流语句会大大降低代码的可读性。

规范

Specification
ECMAScript® 2026 Language Specification
# sec-expression-statement

参见

Help improve MDN

Learn how to contribute

This page was last modified on by MDN contributors.

AltStyle によって変換されたページ (->オリジナル) /