Spec-Zone.ru › JavaScript

Оператор запятая (,)

Базовый Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Оператор запятая (,) вычисляет каждый из своих операндов (слева направо) и возвращает значение последнего операнда. Это часто используется для предоставления нескольких операторов обновления в for циклах в блоке "afterthought".

Попробуйте

let x = 1;

x = (x++, x);

console.log(x);
// Expected output: 2

x = (2, 3);

console.log(x);
// Expected output: 3

Синтаксис

expr1, expr2, expr3/* , … */

Параметры

expr1, expr2, expr3, …
Один или несколько выражений, последнее из которых возвращается как значение составного выражения.

Описание

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

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

Оператор запятая имеет наименьший приоритет среди всех операторов. Если вы хотите включить выражение, разделенное запятыми, в более крупное выражение, вы должны заключить его в скобки.

Оператор запятая полностью отличается от запятых, используемых в качестве синтаксических разделителей в других местах, которые включают:

  • Элементы в инициализаторах массивов ([1, 2, 3])
  • Свойства в инициализаторах объектов ({ a: 1, b: 2 })
  • Параметры в объявлениях/выражениях функций (function f(a, b) { … })
  • Аргументы при вызове функций (f(1, 2))
  • Списки привязки в объявлениях let, const или var (const a = 1, b = 2;)
  • Списки импорта в объявлениях import (import { a, b } from "c";)
  • Списки экспорта в объявлениях export (export { a, b };)

Фактически, хотя некоторые из этих мест принимают почти все выражения, они не принимают выражения, разделенные запятыми, поскольку это было бы неоднозначно с синтаксическими запятыми-разделителями. В этом случае вы должны заключить выражение, разделенное запятыми, в скобки. Например, следующее объявление const объявляет две переменные, где запятая не является оператором запятая:

const a = 1, b = 2;

Это отличается от следующего, где b = 2 является выражением присваивания, а не объявлением. Значение a равно 2, возвращаемому значению присваивания, тогда как значение 1 отбрасывается:

const a = (1, b = 2);

Операторы запятая не могут выступать в качестве завершающих запятых.

Примеры

Использование оператора запятая в цикле for

Если a является 2-мерным массивом с 10 элементами с каждой стороны, следующий код использует оператор запятая для одновременного увеличения i и уменьшения j, тем самым выводя значения диагональных элементов массива:

const a = Array.from({ length: 10 }, () =>
  Array.from({ length: 10 }, Math.random),
); // A 10×10 array of random numbers

for (let i = 0, j = 9; i <= 9; i++, j--) {
  console.log(`a[${i}][${j}] = ${a[i][j]}`);
}

Использование оператора запятая для объединения присваиваний

Поскольку запятые имеют наименьший приоритет — даже ниже, чем у присваивания — запятые могут использоваться для объединения нескольких выражений присваивания. В следующем примере a устанавливается равным значению b = 3 (равному 3). Затем вычисляется выражение c = 4, и его результат становится возвращаемым значением всего выражения запятая.

let a, b, c;

a = b = 3, c = 4; // Returns 4
console.log(a); // 3 (left-most)

let x, y, z;

x = (y = 5, z = 6); // Returns 6
console.log(x); // 6 (right-most)

Обработка и затем возврат

Другой пример, который можно привести с оператором запятая, — это обработка перед возвратом. Как было сказано, будет возвращен только последний элемент, но все остальные также будут вычислены. Таким образом, можно сделать:

function myFunc() {
  let x = 0;

  return (x += 1, x); // the same as return ++x;
}

Это особенно полезно для однострочных стрелочных функций. Следующий пример использует единый map() для получения как суммы массива, так и квадратов его элементов, что в противном случае потребовало бы двух итераций: одна с reduce() и одна с map():

let sum = 0;
const squares = [1, 2, 3, 4, 5].map((x) => ((sum += x), x * x));
console.log(squares); // [1, 4, 9, 16, 25]
console.log(sum); // 15

Отбрасывание привязки ссылки

Оператор запятая всегда возвращает последнее выражение как значение, а не как ссылку. Это приводит к потере некоторой контекстной информации, такой как привязка this. Например, доступ к свойству возвращает ссылку на функцию, которая также запоминает объект, к которому она была получена, чтобы вызов свойства работал должным образом. Если метод возвращается из выражения запятая, то функция вызывается как будто это новое значение функции, и this является undefined.

const obj = {
  value: "obj",
  method() {
    console.log(this.value);
  },
};

obj.method(); // "obj"
(obj.method)(); // "obj" (the grouping operator still returns the reference)
(0, obj.method)(); // undefined (the comma operator returns a new value)

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

globalThis.isDirectEval = false;

{
  const isDirectEval = true;
  console.log(eval("isDirectEval")); // true
  console.log((eval)("isDirectEval")); // true (the grouping operator still returns a reference to `eval`)
  console.log((0, eval)("isDirectEval")); // false (the comma operator returns a new value)
}

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-comma-operator

Совместимость с браузерами

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android WebView на iOS Bun Deno Node.js
comma
1
12
1
4
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • for
  • IIFE

© 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/Operators/Comma_operator

Spec-Zone.ru

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