Чому 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;
=in var bbb = 1;не те саме, що =в aaa = 1;- вони походять з різних виробництв (Initialiser vs AssignmentExpression) в граматиці і просто трапляються використовувати той же маркер.
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.
(1 + 2) * 3, то 1 + 2спочатку обчислюються і результат цього виразу підставляється назад в зовнішні вираження для решти оцінки.
Кома має декілька застосувань у Javascript. У виразі:
a = 1, 2, 3;
це оператор, який просто повертає правий аргумент. Але це також частина синтаксису varдекларацій, які:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(де [...]означає, що частина не є обов'язковою). У вашій varдекларації відсутня назва змінних після коми, тому вона не розбирається. Ви можете отримати бажаний ефект за допомогою:
var a = (1, 2, 3);
Круглі дужки примушують кома розглядатися як оператори, а не роздільники між оголошеннями змінних.
У ваших прикладах кома використовується у двох контекстах:
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 врожайність 3var bbb = (1, 2, 3);
(1, 2, 3)отримує, 3як описано вищеbbbприсвоюється значення3aaa = 1, 2, 3=> Оператор коми використовуються для розділення наступних 3 заяви: aaa=1, 2і 3. Результатом оператора кома є значення останнього твердження 3. Однак aaa присвоюється значення 1, як це добре видно з екрана екрана OP. Причиною цього є прецедент оператора. Найменший пріоритет має Оператор кома.
У першому випадку:
ааа = 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);
}
var a1,a2,a3;просто оголосить три локальні змінні.