Почему aaa = 1,2,3
работает и устанавливает значение aaa
на 1
?
Почему не работает var bbb = 1,2,3
?
Почему var bbb = (1,2,3)
работает и устанавливает значение bbb
на 3
?
Почему aaa = 1,2,3
работает и устанавливает значение aaa
на 1
?
Почему не работает var bbb = 1,2,3
?
Почему var bbb = (1,2,3)
работает и устанавливает значение bbb
на 3
?
Здесь многое происходит, но в основном это сводится к запятой.
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Этот код:
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;
Запятая имеет несколько применений в Javascript. В выражении:
a = 1, 2, 3;
это оператор, который просто возвращает свой правый аргумент. Но это также часть синтаксиса объявлений var
, которые:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(где [...]
означает, что эта часть является необязательной). В объявлении var
отсутствуют имена переменных после запятых, поэтому он не анализирует. Вы можете получить необходимый эффект:
var a = (1, 2, 3);
Скобки заставляют запятые обрабатываться как операторы, а не разделители между объявлениями переменных.
В ваших примерах запятая используется в двух контекстах:
var
statementСинтаксис оператора var
:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
Здесь запятая используется для разделения пар имя-значение переменной. Следующие действия не будут работать, поскольку имя переменной не может начинаться с цифры (см. имена идентификаторов):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда. Следующие выражения работают следующим образом:
aaa = 1, 2, 3;
aaa = 1, 2
дает 2
aaa = 1
оценивается первым, потому что =
имеет более высокий приоритет, чем ,
2, 3
дает 3var bbb = (1, 2, 3);
(1, 2, 3)
дает 3
, как описано вышеbbb
присваивается значение 3
В первом случае:
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);
}