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 Error
bertindak seperti pabrik.
Yang mana yang benar dan mengapa?
javascript
exception
Ilia Choly
sumber
sumber
new
.new Error()
lebih baik dariError()
?Jawaban:
Keduanya baik-baik saja; ini secara eksplisit dinyatakan dalam spesifikasi :
sumber
Error
tidak bertindak seperti pabrik, seperti beberapa konstruktor asli lainnya:Array
,Object
, dll semua cek sesuatu sepertiif (!(this instanceof Array)) { return new Array(arguments); }
. (Tetapi perhatikan ituString(x)
dannew String(x)
sangat berbeda, dan juga untukNumber
danBoolean
.)Yang mengatakan, jika terjadi kesalahan, itu bahkan tidak diharuskan untuk melempar
Error
objek ...throw 'Bad things happened';
akan bekerja,Anda bahkan dapat melempar objek literal untuk debugging:
sumber
String("abc")
tidak membuatString
objek, sedangkannew String("abc")
tidak.Object
=>Object('foo')
mengembalikan sebuah objek string ... datang untuk hal itu hampir semua konstruktor asli adalah sedikit yang salah ...Number
,Boolean
,Date
,String
semua tidak ...Array
,Object
danError
lakukan, tapiEvent
dan semuaDOMxxxx
konstruktor -api melempar kesalahannew Array(arguments)
tidak melakukan apaArray(1, 2, 3)
. Tapi mungkin aku hanya nitpicking :)Error
instance (atau string literal) kehilangan jejak stack. Hanya sedikit pilihan pada artikel terkait:arguments.callee
dilarang dalam mode ketat