Câu lệnh và biểu thức

Các câu lệnh

Câu lệnh là phần mã có thể chạy và thực hiện một hành động nào đó. Ví dụ, if là một câu lệnh:

let myStr;
if (myBool) {
  myStr = 'Yes';
} else {
  myStr = 'No';
}

Một ví dụ khác về câu lệnh là lệnh khai báo hàm:

function twice(x) {
  return x + y;
}

Các biểu thức

Biểu thức là phần mã có thể chạy và tạo ra (trả về) một giá trị. Ví dụ, phần mã giữa hai dấu ngoặc dưới đây là một biểu thức:

let myStr = (myBool ? 'Yes' : 'No');

Toán tử _?_:_ giữa dấu ngoặc được gọi là toán tử ba ngôi (ternary operator). Nó là phiên bản biểu thức của lệnh if.

Khi gõ một biểu thức vào Browser Console hoặc Node.js REPL giá trị biểu thức được hiển thị ngay bên dưới sau khi bấm phím Enter:

> 'ab' + 'cd'
'abcd'
> Number('123')
123
> true || false
true

Ở đâu dùng biểu thức, ở đâu dùng câu lệnh?

Trong thân hàm phải là các câu lệnh:

function max(x, y) {
  if (x > y) {
    return x;
  } else {
    return y;
  }
}

Đối số truyền vào hàm hoặc phương thức phải là biểu thức:

console.log('ab' + 'cd', Number('123'));

Tuy nhiên, biểu thức có thể dùng như câu lệnh. Khi đó nó được gọi là biểu thức câu lệnh (expression statement). Điều ngược lại không đúng: khi ngữ cảnh yêu cầu một biểu thức, bạn không thể sử dụng một câu lệnh.

Đoạn mã dưới đây chứng minh rằng lời gọi hàm bar() có thể dùng như biểu thức hoặc như câu lệnh tùy thuộc vào ngữ cảnh:

function f() {
  console.log(bar());	// bar() là biểu thức
  bar();	// bar() là câu lệnh
}

Các cú pháp không rõ ràng

Sự không rõ ràng giữa khai báo hàm và biểu thức hàm

Khai báo hàm (function declaration) là một câu lệnh:

function id(x) {
  return x;
}

Biểu thức hàm (function expression) là một biểu thức (vế phải của =):

const id = function me(x) {
  return x;
};

Sự không rõ ràng giữa object literal và khối lệnh

Trong đoạn mã sau đây, {} là một object literal: một biểu thức tạo ra một đối tượng trống.

const obj = {};

Đây là một khối lệnh trống (một câu lệnh):

{}

Cách giải quyết của JavaScript

Nếu câu lệnh bắt đầu với function thì JavaScript coi nó là khai báo hàm. Để chỉ rõ nó là biểu thức hàm bạn phải đặt trong dấu ngoặc như ví dụ sau:

(function (x) { console.log(x) })('abc');
// Kết quả:
// 'abc'

Nếu câu lệnh bắt đầu với { thì JavaScript coi nó là khối lệnh. Để chỉ rõ nó là một object literal bạn phải đặt trong dấu ngoặc như ví dụ sau:

({ name: "Hung"}).name
// Kết quả:
// "Hung"