Spec-Zone.ru › JavaScript

Выражение-оператор

Выражение-оператор — это выражение, используемое там, где ожидается оператор. Выражение вычисляется, и его результат отбрасывается — поэтому это имеет смысл только для выражений, имеющих побочные эффекты, таких как выполнение функции или обновление переменной.

Синтаксис

expression;
expression
Произвольное выражение для вычисления. Существуют определенные выражения, которые могут быть неоднозначными с другими операторами и поэтому запрещены.

Описание

Помимо специальных синтаксисов операторов, вы также можете использовать почти любое выражение как самостоятельный оператор. Синтаксис выражения-оператора требует точки с запятой в конце, но автоматическая вставка точки с запятой может вставить ее для вас, если отсутствие точки с запятой приводит к недопустимому синтаксису.

Поскольку выражение вычисляется, а затем отбрасывается, результат выражения недоступен. Следовательно, выражение должно иметь какой-либо побочный эффект, чтобы быть полезным. Выражения-операторы обычно являются:

  • Вызовы функций (console.log("Hello");, [1, 2, 3].forEach((i) => console.log(i));)
  • Тегированные шаблонные литералы
  • Операторы присваивания, включая составные присваивания
  • Операторы инкремента и декремента
  • delete
  • import()
  • yield и yield*

Другие также могут иметь побочные эффекты, если они вызывают геттеры или вызывают приведение типов.

Запрещенные выражения

Чтобы выражение могло быть использовано как оператор, оно не должно быть неоднозначным с другими синтаксисами операторов. Поэтому выражение не должно начинаться ни с одного из следующих токенов:

  • function: что будет function объявление или function* объявление, а не function выражение или function* выражение
  • async function: что будет async function объявление или async function* объявление, а не async function выражение или async function* выражение
  • class: что будет class объявление, а не class выражение
  • let[: что будет let объявление с деструктуризацией массива, а не доступ к свойству у переменной с именем let (let может быть только идентификатором в нестрогом режиме)
  • {: что будет блочным оператором, а не инициализатором объекта

Следовательно, все следующее недействительно:

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 ':'
};

Более опасно то, что иногда код оказывается синтаксически верным, но не тем, что вы имели в виду.

// 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 };

Чтобы избежать этих проблем, вы можете использовать скобки, чтобы оператор однозначно был выражением-оператором.

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

Примеры

Избегание операторов управления потоком

Вы можете избежать почти всего использования операторов управления потоком, используя выражения-операторы. Например, if...else можно заменить тернарными операторами и логическими операторами. Итерационные операторы, такие как for или for...of, могут быть заменены методами массивов.

// 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® 2027 Language Specification
# sec-expression-statement

См. также

  • Операторы и объявления
  • Выражения и операторы

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/Expression_statement

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API