Чи працює завдання з комою?


108

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

Чому не var bbb = 1,2,3працює?

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

Приклад сеансу консолі


9
Ви отримуєте синтаксичну помилку, оскільки імена змінних заборонено починати з числа. var a1,a2,a3;просто оголосить три локальні змінні.
Джаред Фарріш

Відповіді:


200

Тут багато чого відбувається, але в основному це зводиться до оператора комами .

Оператор комами оцінює обидва його операнди (зліва направо) і повертає значення другого операнда.


Цей код:

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;

17
Тим більше, що в =in var bbb = 1;не те саме, що =в aaa = 1;- вони походять з різних виробництв (Initialiser vs AssignmentExpression) в граматиці і просто трапляються використовувати той же маркер.
Райан Кавано

7
Дуже приємне пояснення. Не зовсім явним було те, що a = 1, 2, 3можна скористатись круглими дужками як те, (a = 1), 2, 3що оцінюється як a = 1; 2; 3(і повертає 3, наприклад b = (a = 1, 2, 3), призначить 3 до b). На відміну від цього, a = (1, 2, 3)оцінює як 1; 2; a = 3і повертає 3.
CompuChip

Що говорить MDN про паролі в присвоєнні змінних і чому це зворотне? Я не зміг знайти документа
Брайан

@staticx Насправді нічого не робиться "в зворотному порядку". Дужки оцінюються спочатку. Так само , як якщо у вас є (1 + 2) * 3, то 1 + 2спочатку обчислюються і результат цього виразу підставляється назад в зовнішні вираження для решти оцінки.
pswg

9

Кома має декілька застосувань у Javascript. У виразі:

a = 1, 2, 3;

це оператор, який просто повертає правий аргумент. Але це також частина синтаксису varдекларацій, які:

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

(де [...]означає, що частина не є обов'язковою). У вашій varдекларації відсутня назва змінних після коми, тому вона не розбирається. Ви можете отримати бажаний ефект за допомогою:

var a = (1, 2, 3);

Круглі дужки примушують кома розглядатися як оператори, а не роздільники між оголошеннями змінних.


7

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

var заява

Синтаксис 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 врожайність 3
var bbb = (1, 2, 3);
  • вираз (1, 2, 3)отримує, 3як описано вище
  • Змінній bbbприсвоюється значення3

2
aaa = 1, 2, 3=> Оператор коми використовуються для розділення наступних 3 заяви: aaa=1, 2і 3. Результатом оператора кома є значення останнього твердження 3. Однак aaa присвоюється значення 1, як це добре видно з екрана екрана OP. Причиною цього є прецедент оператора. Найменший пріоритет має Оператор кома.
Тібос

1

У першому випадку:

ааа = 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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.