表示式語句

表示式語句是指在期望使用語句的地方使用表示式。表示式會被求值,但其結果會被丟棄——因此,它只對具有副作用的表示式有意義,例如執行函式或更新變數。

語法

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

另見