var err1 = Error('message');
var err2 = new Error('message');
Co za różnica? Patrząc na nie w chromowanej konsoli wyglądają identycznie. Te same właściwości obiektu i ten sam __proto__
łańcuch. Prawie wygląda na to, że Error
działa jak fabryka.
Który z nich jest poprawny i dlaczego?
javascript
exception
Ilia Choly
źródło
źródło
new
.new Error()
lepsze niżError()
?Odpowiedzi:
Obie są w porządku; jest to wyraźnie określone w specyfikacji :
źródło
Error
ma działać jak w fabryce, tak jak w niektórych innych rodzimych konstruktorów:Array
,Object
itd wszystkie wyboru coś podobnegoif (!(this instanceof Array)) { return new Array(arguments); }
. (Ale zauważ toString(x)
inew String(x)
są bardzo różne, podobnie jakNumber
iBoolean
.)To powiedziawszy, w przypadku błędu nie jest nawet wymagane rzucanie
Error
obiektu ... teżthrow 'Bad things happened';
zadziałaMożesz nawet rzucić literał obiektu do debugowania:
źródło
String("abc")
nie tworzyString
obiektu, alenew String("abc")
robi.Object
=>Object('foo')
zwraca obiekt ciąg ... przyjść do rzeczy z nim prawie wszystkie rodzimych konstruktorów jest nieco źle ...Number
,Boolean
,Date
,String
wszystko nie ...Array
,Object
iError
robić, aleEvent
i wszyscyDOMxxxx
konstruktorzy -api rzucają błędynew Array(arguments)
nie robi dokładnie tego, coArray(1, 2, 3)
robi. Ale pewnie tylkoError
instancjami (lub literałów ciągu) powoduje utratę śladu stosu. Wystarczy tylko drobiazg w powiązanym artykule:arguments.callee
jest zabroniony w trybie ścisłym