Expression statement
Một expression statement là một biểu thức được sử dụng ở nơi mà một câu lệnh được mong đợi. Biểu thức được đánh giá và kết quả của nó bị loại bỏ — do đó, nó chỉ có ý nghĩa đối với các biểu thức có tác dụng phụ, chẳng hạn như thực thi một hàm hoặc cập nhật một biến.
Cú pháp
expression;
expression-
Một biểu thức tùy ý để được đánh giá. Có một số biểu thức nhất định có thể gây mơ hồ với các cú pháp câu lệnh khác và do đó bị cấm.
Mô tả
Ngoài các cú pháp câu lệnh chuyên dụng, bạn cũng có thể sử dụng hầu hết mọi biểu thức như một câu lệnh độc lập. Cú pháp expression statement yêu cầu một dấu chấm phẩy ở cuối, nhưng quá trình chèn dấu chấm phẩy tự động có thể chèn một dấu cho bạn nếu việc thiếu dấu chấm phẩy dẫn đến cú pháp không hợp lệ.
Vì biểu thức được đánh giá rồi bị loại bỏ, kết quả của biểu thức không có sẵn. Do đó, biểu thức phải có một số tác dụng phụ để có ích. Các expression statement thường là:
- Lời gọi hàm (
console.log("Hello");,[1, 2, 3].forEach((i) => console.log(i));) - Tagged template literals
- Biểu thức gán, bao gồm các phép gán phức hợp
- Toán tử tăng và giảm
deleteimport()yieldvàyield*
Các biểu thức khác cũng có thể có tác dụng phụ nếu chúng kích hoạt getter hoặc gây ép kiểu.
Biểu thức bị cấm
Để một biểu thức có thể được sử dụng như một câu lệnh, nó không được gây mơ hồ với các cú pháp câu lệnh khác. Do đó, biểu thức không được bắt đầu bằng bất kỳ token nào sau đây:
function: sẽ là một khai báofunctionhoặc khai báofunction*, chứ không phải là một biểu thứcfunctionhoặc biểu thứcfunction*async function: sẽ là một khai báoasync functionhoặc khai báoasync function*, chứ không phải là một biểu thứcasync functionhoặc biểu thứcasync function*class: sẽ là một khai báoclass, chứ không phải là một biểu thứcclasslet[: sẽ là một khai báoletvới array destructuring, chứ không phải là một property accessor trên một biến có tênlet(letchỉ có thể là một identifier trong chế độ không nghiêm ngặt){: sẽ là một block statement, chứ không phải là một object literal
Do đó, tất cả những điều sau đây đều không hợp lệ:
function foo() {
console.log("foo");
}(); // SyntaxError: Unexpected token '('
// Vì một lý do nào đó, bạn có một biến gọi là `let`
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
foo: 1,
bar: 2, // SyntaxError: Unexpected token ':'
};
Nguy hiểm hơn, đôi khi code lại là cú pháp hợp lệ, nhưng không phải là những gì bạn muốn.
// Vì một lý do nào đó, bạn có một biến gọi là `let`
var let = [1, 2, 3];
function setIndex(index, value) {
if (index >= 0) {
// Có ý định gán cho mảng `let`, nhưng thay vào đó tạo ra một biến bổ sung!
let[index] = value;
}
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// Đây không phải là một object literal, mà là một block statement,
// nơi `foo` là một nhãn và `1` là một expression statement.
// Điều này thường xảy ra trong console
{ foo: 1 };
Để tránh những vấn đề này, bạn có thể sử dụng dấu ngoặc đơn, để câu lệnh rõ ràng là một expression statement.
(function foo() {
console.log("foo");
})();
Ví dụ
>Tránh các câu lệnh luồng điều khiển
Bạn có thể tránh hầu hết các cách sử dụng câu lệnh luồng điều khiển bằng cách sử dụng expression statement. Ví dụ, if...else có thể được thay thế bằng toán tử ba ngôi và toán tử logic. Các câu lệnh lặp như for hoặc for...of có thể được thay thế bằng phương thức mảng.
// Sử dụng câu lệnh luồng điều khiển
function range(start, end) {
if (start > end) {
[start, end] = [end, start];
}
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
// Sử dụng expression statement
function range2(start, end) {
start > end && ([start, end] = [end, start]);
return Array.from({ length: end - start }, (_, i) => start + i);
}
Warning: Điều này chỉ minh họa một khả năng của ngôn ngữ. Việc sử dụng quá nhiều expression statement như một sự thay thế cho các câu lệnh luồng điều khiển có thể làm cho code khó đọc hơn nhiều.
Đặc tả kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-expression-statement> |