Trong Javascript, sự khác biệt giữa throw Error('msg') so với throw new Error('msg') là gì?

Cả hai cú pháp throw Error('msg')throw new Error('msg') đều tạo ra một đối tượng lỗi và ném nó, nhưng có một vài điểm khác biệt cần lưu ý khi sử dụng chúng.

1. throw Error('msg')

Đây là cú pháp ngắn gọn, JavaScript cho phép gọi hàm Error mà không cần sử dụng từ khóa new. Tuy nhiên, khi sử dụng cú pháp này, JavaScript vẫn sẽ tạo ra một đối tượng Error như khi sử dụng từ khóa new. Nghĩa là, Error('msg')new Error('msg') đều tạo ra một đối tượng Error.

throw Error('This is an error');

Kết quả là một đối tượng Error được tạo ra và ném ra với thông điệp 'This is an error'.

2. throw new Error('msg')

Đây là cú pháp chuẩn và rõ ràng để tạo một đối tượng Error mới. Khi sử dụng new Error('msg'), từ khóa new đảm bảo rằng một đối tượng Error mới được khởi tạo với thông điệp 'msg'.

throw new Error('This is an error');

Kết quả là một đối tượng Error mới được tạo ra và ném ra với thông điệp 'This is an error'.

Sự khác biệt chính

  • Minh bạch và rõ ràng: Khi sử dụng throw new Error('msg'), bạn có thể ngay lập tức thấy rằng một đối tượng mới đang được khởi tạo, điều này làm mã rõ ràng và dễ hiểu hơn. Trong khi đó, throw Error('msg') có thể gây nhầm lẫn vì thiếu từ khóa new, dù kết quả đầu ra là tương tự.
  • Chuẩn mực: Sử dụng new Error('msg') là chuẩn mực vì nó rõ ràng rằng bạn đang tạo một đối tượng mới. Việc sử dụng cú pháp này cũng làm cho mã dễ bảo trì hơn.

Ví dụ chi tiết:

try {
    throw Error('Error without new');
} catch (e) {
    console.log(e instanceof Error); // true
    console.log(e.message); // "Error without new"
}

try {
    throw new Error('Error with new');
} catch (e) {
    console.log(e instanceof Error); // true
    console.log(e.message); // "Error with new"
}

Trong cả hai trường hợp, kết quả là một đối tượng Error được tạo ra và ném ra với thông điệp lỗi tương ứng.