Выражение-оператор
Выражение-оператор — это выражение, используемое там, где ожидается оператор. Выражение вычисляется, и его результат отбрасывается — поэтому это имеет смысл только для выражений, имеющих побочные эффекты, таких как выполнение функции или обновление переменной.
Синтаксис
expression;
-
expression - Произвольное выражение для вычисления. Существуют определенные выражения, которые могут быть неоднозначными с другими операторами и поэтому запрещены.
Описание
Помимо специальных синтаксисов операторов, вы также можете использовать почти любое выражение как самостоятельный оператор. Синтаксис выражения-оператора требует точки с запятой в конце, но автоматическая вставка точки с запятой может вставить ее для вас, если отсутствие точки с запятой приводит к недопустимому синтаксису.
Поскольку выражение вычисляется, а затем отбрасывается, результат выражения недоступен. Следовательно, выражение должно иметь какой-либо побочный эффект, чтобы быть полезным. Выражения-операторы обычно являются:
- Вызовы функций (
console.log("Hello");,[1, 2, 3].forEach((i) => console.log(i));) - Тегированные шаблонные литералы
- Операторы присваивания, включая составные присваивания
- Операторы инкремента и декремента
deleteimport()-
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);
}
Предупреждение: Это демонстрирует только возможности языка. Чрезмерное использование выражений-операторов в качестве замены операторов управления потоком может сделать код гораздо менее читаемым.
Спецификации
См. также
© 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