throw Error ('msg') vs throw new Error ('msg')


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

Apa bedanya? Melihat mereka di konsol chrome, mereka terlihat identik. Properti yang sama pada objek dan __proto__rantai yang sama . Hampir terlihat seperti Errorbertindak seperti pabrik.

Yang mana yang benar dan mengapa?


5
Semua konstruktor asli didefinisikan dalam ECMAScript, termasuk perilaku masing-masing ketika dipanggil tanpa new.
I Hate Lazy

Jawaban:



17

Errortidak bertindak seperti pabrik, seperti beberapa konstruktor asli lainnya: Array, Object, dll semua cek sesuatu seperti if (!(this instanceof Array)) { return new Array(arguments); }. (Tetapi perhatikan itu String(x)dan new String(x)sangat berbeda, dan juga untuk Numberdan Boolean.)

Yang mengatakan, jika terjadi kesalahan, itu bahkan tidak diharuskan untuk melempar Errorobjek ... throw 'Bad things happened';akan bekerja,
Anda bahkan dapat melempar objek literal untuk debugging:

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

9
Saya khawatir saya tidak sepenuhnya setuju. String("abc")tidak membuat Stringobjek, sedangkan new String("abc")tidak.
pimvdb

2
@pimvdb: benar, aku sudah berubah ke Object=> Object('foo')mengembalikan sebuah objek string ... datang untuk hal itu hampir semua konstruktor asli adalah sedikit yang salah ... Number, Boolean, Date, Stringsemua tidak ... Array, Objectdan Errorlakukan, tapi Eventdan semua DOMxxxxkonstruktor -api melempar kesalahan
Elias Van Ootegem

Saya juga berpikir new Array(arguments)tidak melakukan apa Array(1, 2, 3). Tapi mungkin aku hanya nitpicking :)
pimvdb

8
Komplementer terkait dengan melempar string: String bukan kesalahan
alex

11
@ alex: Diberikan, melontarkan Errorinstance (atau string literal) kehilangan jejak stack. Hanya sedikit pilihan pada artikel terkait: arguments.calleedilarang dalam mode ketat
Elias Van Ootegem
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.