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

js
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à:

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:

Do đó, tất cả những điều sau đây đều không hợp lệ:

js
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.

js
// 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.

js
(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ôitoá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.

js
// 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

Xem thêm