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?

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

Jawaban:

164

Keduanya baik-baik saja; ini secara eksplisit dinyatakan dalam spesifikasi :

... Jadi pemanggilan fungsi Error(…)setara dengan ekspresi penciptaan objek new Error(…)dengan argumen yang sama.

pimvdb
sumber
7
Apakah ini juga berlaku di ES6?
paulmelnikow
4
Iya. Untuk dokumen saat ini, lihat: ecma-international.org/ecma-262/6.0/…
theUtherSide
@paulmelnikow - Ya. Kompatibilitas mundur adalah prioritas tertinggi TC39. Mantra ini adalah "jangan merusak web."
TJ Crowder
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'};
Elias Van Ootegem
sumber
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