Tại sao aaa = 1,2,3
công việc và thiết lập giá trị của aaa
để 1
?
Tại sao không var bbb = 1,2,3
hoạt động?
Tại sao var bbb = (1,2,3)
công việc và thiết lập giá trị của bbb
để 3
?
Tại sao aaa = 1,2,3
công việc và thiết lập giá trị của aaa
để 1
?
Tại sao không var bbb = 1,2,3
hoạt động?
Tại sao var bbb = (1,2,3)
công việc và thiết lập giá trị của bbb
để 3
?
Câu trả lời:
Có rất nhiều điều đang diễn ra ở đây, nhưng về cơ bản, nó phụ thuộc vào toán tử dấu phẩy .
Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.
Mã này:
aaa = 1,2,3
Tương đương với:
aaa = 1;
2;
3;
Vì vậy, aaa
được khai báo ngầm và gán giá trị là 1. Lưu ý rằng đầu ra trên bảng điều khiển là kết quả của câu lệnh cuối cùng, 3.
Mã này:
var bbb = 1,2,3
Là lỗi cú pháp vì dấu phẩy trong khai báo biến dùng để khai báo nhiều biến trên một dòng. Như bài báo MDN đã chỉ ra,
Lưu ý rằng dấu phẩy trong
var
câu lệnh không phải là toán tử dấu phẩy, vì nó không tồn tại trong một biểu thức. Đúng hơn, nó là một ký tự đặc biệt trong cácvar
câu lệnh để kết hợp nhiều trong số chúng thành một.
Vì vậy, mã này gần tương đương với:
var bbb = 1;
var 2;
var 3;
Tất nhiên, 2
không phải là một định danh hợp lệ, vì vậy nó không thành công tại thời điểm đó.
Mã này:
var bbb = (1,2,3)
Rất giống với giá trị đầu tiên, ngoại trừ vì các giá trị số được bao bọc trong dấu ngoặc đơn, chúng được đánh giá đầu tiên. Vì vậy, điều này gần như tương đương với:
1;
2;
var bbb = 3;
=
trong var bbb = 1;
không giống =
như trong aaa = 1;
- chúng đến từ các sản phẩm khác nhau (Initialiser vs AssignmentExpression) trong ngữ pháp và chỉ tình cờ sử dụng cùng một mã thông báo.
a = 1, 2, 3
có thể được đặt trong dấu ngoặc đơn (a = 1), 2, 3
đánh giá là a = 1; 2; 3
(và trả về 3, ví dụ: b = (a = 1, 2, 3)
sẽ gán 3 cho b). Ngược lại, a = (1, 2, 3)
đánh giá là 1; 2; a = 3
và trả về 3
(1 + 2) * 3
, biểu thức 1 + 2
được đánh giá đầu tiên và kết quả của biểu thức đó được thay thế trở lại thành biểu thức bên ngoài cho phần còn lại của đánh giá.
Dấu phẩy có nhiều công dụng trong Javascript. Trong biểu thức:
a = 1, 2, 3;
đó là một toán tử chỉ trả về đối số bên phải của nó. Nhưng nó cũng là một phần của cú pháp var
khai báo, đó là:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
( [...]
có nghĩa là phần đó là tùy chọn). var
Khai báo của bạn thiếu tên biến sau dấu phẩy, vì vậy nó không phân tích cú pháp. Bạn có thể có được hiệu ứng bạn muốn với:
var a = (1, 2, 3);
Các dấu ngoặc buộc các dấu phẩy được coi là toán tử chứ không phải là dấu phân cách giữa các khai báo biến.
Trong các ví dụ của bạn, dấu phẩy được sử dụng trong hai ngữ cảnh:
var
tuyên bốCú pháp của var
câu lệnh là:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
Ở đây, dấu phẩy được dùng để phân tách các cặp giá trị-tên biến. Cách sau sẽ không hoạt động vì tên biến không thể bắt đầu bằng chữ số (xem tên mã định danh ):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai. Các biểu thức sau hoạt động như sau:
aaa = 1, 2, 3;
aaa = 1, 2
mang lại 2
aaa = 1
được đánh giá đầu tiên vì =
có mức độ ưu tiên cao hơn,
2, 3
sản lượng 3var bbb = (1, 2, 3);
(1, 2, 3)
mang lại 3
như được mô tả ở trênbbb
được gán giá trị3
aaa = 1, 2, 3
=> Các nhà điều hành dấu phẩy được sử dụng để tách 3 câu sau đây: aaa=1
, 2
và 3
. Kết quả của toán tử dấu phẩy là giá trị của câu lệnh cuối cùng là 3. Tuy nhiên, aaa được gán giá trị là 1, có thể thấy rõ ràng từ ảnh chụp màn hình của OP. Lý do cho điều này là ưu tiên toán tử, với toán tử dấu phẩy có ưu tiên thấp nhất.
Trong trường hợp đầu tiên:
aaa = 1,2,3
dấu phẩy đóng vai trò là dấu phân cách biểu thức. Nó thực hiện một nhiệm vụ aaa
, sau đó nó tính toán 2
và loại bỏ nó, sau đó nó tính toán 3
và loại bỏ nó.
Trong phần thứ hai:
var bbb = 1,2,3
Các var
từ khóa cho trình biên dịch Javascript rằng điều tiếp theo sau một ,
nên được một tên biến. Nó không tìm thấy trên, vì vậy nó chết và gags.
var bbb = (1,2,3)
Ở đây, trình biên dịch đầu tiên đánh giá 1
và bỏ qua nó. Sau đó, nó đánh giá 2
và bỏ qua nó. Sau đó, nó đánh giá 3
và điều đó được để lại trên ngăn xếp để nó được gán chobbb
Mặc dù việc sử dụng dấu phẩy để phân tách các biểu thức không phổ biến, nhưng nó đôi khi hữu ích trong những thứ như for
ngoại hình.
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
sẽ chỉ cần khai báo ba biến cục bộ.