Работает ли запятая с запятой?

Почему aaa = 1,2,3 работает и устанавливает значение aaa на 1?

Почему не работает var bbb = 1,2,3?

Почему var bbb = (1,2,3) работает и устанавливает значение bbb на 3?

Example console session

Ответ 1

Здесь многое происходит, но в основном это сводится к запятой.

Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.


Этот код:

aaa = 1,2,3

Является эквивалентным:

aaa = 1;
2;
3;

Итак, aaa объявляется неявно и присваивается значение 1. Обратите внимание, что вывод на консоли является результатом последнего оператора, 3.


Этот код:

var bbb = 1,2,3

Является синтаксической ошибкой, потому что запятые в объявлениях переменных используются для объявления нескольких переменных в одной строке. Как указывает статья MDN,

Обратите внимание, что запятая в выражении var не операторе запятой, потому что она не существует в выражении. Скорее, это специальный символ в операторах var для объединения нескольких из них в один.

Итак, этот код примерно эквивалентен:

var bbb = 1;
var 2;
var 3;

Конечно, 2 не является допустимым идентификатором, поэтому он терпит неудачу в этой точке.


Этот код:

var bbb = (1,2,3)

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

1;
2;
var bbb = 3;

Ответ 2

Запятая имеет несколько применений в Javascript. В выражении:

a = 1, 2, 3;

это оператор, который просто возвращает свой правый аргумент. Но это также часть синтаксиса объявлений var, которые:

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(где [...] означает, что эта часть является необязательной). В объявлении var отсутствуют имена переменных после запятых, поэтому он не анализирует. Вы можете получить необходимый эффект:

var a = (1, 2, 3);

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

Ответ 3

В ваших примерах запятая используется в двух контекстах:

var statement

Синтаксис оператора var:

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

Здесь запятая используется для разделения пар имя-значение переменной. Следующие действия не будут работать, поскольку имя переменной не может начинаться с цифры (см. имена идентификаторов):

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

Comma Operator

Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда. Следующие выражения работают следующим образом:

aaa = 1, 2, 3;
  • aaa = 1, 2 дает 2
    • обратите внимание, что aaa = 1 оценивается первым, потому что = имеет более высокий приоритет, чем ,
  • 2, 3 дает 3
var bbb = (1, 2, 3);
  • выражение (1, 2, 3) дает 3, как описано выше
  • Переменной bbb присваивается значение 3

Ответ 4

В первом случае:

aaa = 1,2,3

запятые служат разделителями выражений. Он выполняет назначение aaa, затем вычисляет 2 и отбрасывает его, затем вычисляет 3 и отбрасывает его.

Во втором:

var bbb = 1,2,3

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

var bbb = (1,2,3)

Здесь компилятор сначала оценивает 1 и игнорирует его. Затем он оценивает 2 и игнорирует его. Затем он оценивает 3 и остается в стеке, поэтому ему присваивается bbb

В то время как использование запятых для разделения выражений не является обычным явлением, оно иногда полезно в таких вещах, как for.

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}