Чому 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
присвоюється значення3
aaa = 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;
просто оголосить три локальні змінні.