表达式语句

表达式语句是指在期望使用语句的地方使用表达式。表达式会被求值,但其结果会被丢弃——因此,它只对具有副作用的表达式有意义,例如执行函数或更新变量。

语法

js
expression;
表达式

任何要被求值的表达式。存在某些表达式可能与其他语句语法有歧义,因此被禁止。

描述

除了专门的语句语法之外,你还可以将几乎任何表达式作为独立的语句使用。表达式语句语法要求以分号结尾,但是如果缺少分号导致语法无效,自动分号插入过程可能会为你插入一个。

由于表达式被求值后即被丢弃,所以表达式的结果是不可用的。因此,表达式必须具有某些副作用才能发挥作用。表达式语句通常是:

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

被禁止的表达式

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

因此,以下所有示例都是无效的:

js
function foo() {
  console.log("foo");
}(); // SyntaxError: Unexpected token '('

// For some reason, you have a variable called `let`
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target

{
  foo: 1,
  bar: 2, // SyntaxError: Unexpected token ':'
};

更危险的是,有时代码恰好是有效的语法,但并非你所期望的。

js
// For some reason, you have a variable called `let`
var let = [1, 2, 3];

function setIndex(index, value) {
  if (index >= 0) {
    // Intend to assign to the array `let`, but instead creates an extra variable!
    let[index] = value;
  }
}

setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]

// This is not an object literal, but a block statement,
// where `foo` is a label and `1` is an expression statement.
// This often happens in the console
{ foo: 1 };

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

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

示例

避免控制流语句

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

js
// Using control flow statements
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;
}

// Using expression statements
function range2(start, end) {
  start > end && ([start, end] = [end, start]);
  return Array.from({ length: end - start }, (_, i) => start + i);
}

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

规范

规范
ECMAScript® 2026 语言规范
# sec-expression-statement

另见