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