ném lỗi ('tin nhắn') so với ném lỗi mới ('tin nhắn')


165
var err1 = Error('message');
var err2 = new Error('message');

Có gì khác biệt? Nhìn vào chúng trong bảng điều khiển chrome, chúng trông giống hệt nhau. Các thuộc tính giống nhau trên đối tượng và cùng một __proto__chuỗi. Hầu như có vẻ như Errorhoạt động như một nhà máy.

Cái nào đúng và tại sao?


5
Tất cả các hàm tạo riêng được định nghĩa trong ECMAScript, bao gồm cả hành vi tương ứng của chúng khi được gọi mà không có new.
Tôi ghét Lười

Câu trả lời:


164

Cả hai đều ổn; điều này được nêu rõ trong đặc tả :

... Do đó, lời gọi hàm Error(…)tương đương với biểu thức tạo đối tượng new Error(…)có cùng đối số.


7
Điều này có đúng trong ES6 không?
paulmelnikow

4
Đúng. Đối với các tài liệu hiện tại, hãy xem: ecma
i Intl.org/ecma-262/6.0/ Kẻ

@paulmelnikow - Có. Khả năng tương thích ngược là ưu tiên cao nhất của TC39. Câu thần chú là "đừng phá vỡ web."
TJ Crowder

17

Errorkhông hành động như một nhà máy, như một số nhà xây dựng có nguồn gốc khác: Array, Object, vv tất cả cái gì đó kiểm tra như if (!(this instanceof Array)) { return new Array(arguments); }. (Nhưng lưu ý rằng String(x)new String(x)rất khác nhau, và tương tự cho NumberBoolean.)

Điều đó nói rằng, trong trường hợp có lỗi, thậm chí không bắt buộc phải ném một Errorđối tượng ... throw 'Bad things happened';cũng sẽ hoạt động.
Bạn thậm chí có thể ném một đối tượng theo nghĩa đen để gỡ lỗi:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};

9
Tôi sợ tôi không hoàn toàn đồng ý. String("abc")không tạo ra một Stringđối tượng, trong khi new String("abc")đó.
pimvdb

2
@pimvdb: đúng, tôi đã thay đổi nó để Object=> Object('foo')trả về một đối tượng chuỗi ... đến vấn đề của nó gần như tất cả các nhà xây dựng có nguồn gốc là một sai chút ... Number, Boolean, Date, Stringtất cả không ... Array, ObjectErrorlàm, nhưng Eventvà tất cả các DOMxxxxnhà xây dựng -api ném lỗi
Elias Van Ootegem

Tôi cũng nghĩ rằng new Array(arguments)không làm chính xác những gì Array(1, 2, 3)làm. Nhưng có lẽ tôi chỉ là nitpicking :)
pimvdb

8
Bổ sung liên quan đến ném chuỗi: Chuỗi không phải là lỗi
alex

11
@alex: Cấp, ném phi Errortrường hợp (hoặc chuỗi ký tự) mất dấu vết ngăn xếp. Chỉ cần chọn nit trên bài viết được liên kết: arguments.calleebị cấm trong chế độ nghiêm ngặt
Elias Van Ootegem
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.