表达式语句

**表达式语句**是在需要语句的地方使用的表达式。表达式将被评估,其结果将被丢弃 - 因此,它只对具有副作用的表达式有意义,例如执行函数或更新变量。

语法

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 语言规范
# sec-expression-statement

另请参阅