表示式語句
表示式語句是指在期望使用語句的地方使用表示式。表示式會被求值,但其結果會被丟棄——因此,它只對具有副作用的表示式有意義,例如執行函式或更新變數。
語法
js
expression;
描述
除了專門的語句語法之外,你還可以將幾乎任何表示式作為獨立的語句使用。表示式語句語法要求以分號結尾,但是如果缺少分號導致語法無效,自動分號插入過程可能會為你插入一個。
由於表示式被求值後即被丟棄,所以表示式的結果是不可用的。因此,表示式必須具有某些副作用才能發揮作用。表示式語句通常是:
被禁止的表示式
為了將表示式用作語句,它不能與其他語句語法有歧義。因此,表示式不能以以下任何標記開頭:
function: 這將是function宣告或function*宣告,而不是function表示式或function*表示式async function: 這將是async function宣告或async function*宣告,而不是async function表示式或async function*表示式class: 這將是class宣告,而不是class表示式let[: 這將是帶有陣列解構的let宣告,而不是名為let的變數上的屬性訪問器(在非嚴格模式下,let只能是識別符號){: 這將是塊語句,而不是物件字面量
因此,以下所有示例都是無效的:
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 可以用三元運算子和邏輯運算子替代。迭代語句如 for 或 for...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 |