Bài tập có dấu phẩy có hiệu quả không?


108

Tại sao aaa = 1,2,3công việc và thiết lập giá trị của aaađể 1?

Tại sao không var bbb = 1,2,3hoạ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?

Phiên bảng điều khiển mẫu


9
Bạn gặp lỗi cú pháp vì tên biến không được phép bắt đầu bằng một số. var a1,a2,a3;sẽ chỉ cần khai báo ba biến cục bộ.
Jared Farrish

Câu trả lời:


200

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 varcâ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ác varcâ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, 2khô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;

17
Thậm chí nhiều hơn, =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.
Ryan Cavanaugh

7
Giải thích rất hay. Điều không hoàn toàn rõ ràng là a = 1, 2, 3có 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 = 3và trả về 3
CompuChip

MDN nói gì về parens trong phép gán biến và tại sao nó ngược lại? Tôi không thể tìm thấy tài liệu
Brian

@staticx Không có gì thực sự được thực hiện 'ngược lại'. Các dấu ngoặc đơn được đánh giá đầu tiên. Giống như khi bạn có (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á.
pswg

9

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 varkhai báo, đó là:

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

( [...]có nghĩa là phần đó là tùy chọn). varKhai 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.


7

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 varcâ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

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
    • lưu ý rằng aaa = 1được đánh giá đầu tiên vì =có mức độ ưu tiên cao hơn,
  • 2, 3 sản lượng 3
var bbb = (1, 2, 3);
  • biểu thức (1, 2, 3)mang lại 3như được mô tả ở trên
  • Biến bbbđược gán giá trị3

2
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, 23. 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.
Tibos

1

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 2và loại bỏ nó, sau đó nó tính toán 3và loại bỏ nó.

Trong phần thứ hai:

var bbb = 1,2,3

Các vartừ 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á 1và bỏ qua nó. Sau đó, nó đánh giá 2và bỏ qua nó. Sau đó, nó đánh giá 3và đ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ư forngoại hình.

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.