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


165
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 Errordziała jak fabryka.

Który z nich jest poprawny i dlaczego?


5
Wszystkie rodzime konstruktory są zdefiniowane w ECMAScript, w tym ich odpowiednie zachowanie, gdy są wywoływane bez new.
I Hate Lazy

Odpowiedzi:


164

Obie są w porządku; jest to wyraźnie określone w specyfikacji :

... Zatem wywołanie funkcji Error(…)jest równoważne wyrażeniu tworzenia obiektu new Error(…)z tymi samymi argumentami.


7
Czy to prawda również w ES6?
paulmelnikow

4
Tak. Aktualne dokumenty można znaleźć na stronie: ecma-international.org/ecma-262/6.0/…
theUtherSide

@paulmelnikow - Tak. Kompatybilność wsteczna jest najwyższym priorytetem TC39. Mantra brzmi „nie niszcz sieci”.
TJ Crowder

17

Errorma działać jak w fabryce, tak jak w niektórych innych rodzimych konstruktorów: Array, Objectitd wszystkie wyboru coś podobnego if (!(this instanceof Array)) { return new Array(arguments); }. (Ale zauważ to String(x)i new String(x)są bardzo różne, podobnie jak Numberi Boolean.)

To powiedziawszy, w przypadku błędu nie jest nawet wymagane rzucanie Errorobiektu ... też throw 'Bad things happened';zadziała
Możesz nawet rzucić literał obiektu do debugowania:

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

9
Obawiam się, że nie do końca się z tym zgadzam. String("abc")nie tworzy Stringobiektu, ale new String("abc")robi.
pimvdb

2
@pimvdb: true, zmieniłem go na Object=> Object('foo')zwraca obiekt ciąg ... przyjść do rzeczy z nim prawie wszystkie rodzimych konstruktorów jest nieco źle ... Number, Boolean, Date, Stringwszystko nie ... Array, Objecti Errorrobić, ale Eventi wszyscy DOMxxxxkonstruktorzy -api rzucają błędy
Elias Van Ootegem

Myślę też, że new Array(arguments)nie robi dokładnie tego, co Array(1, 2, 3)robi. Ale pewnie tylko
czepiam się czubka

8
Komplementarny w odniesieniu do rzucania ciągów znaków: ciąg nie jest błędem
alex

11
@alex: przyznane, wyrzucanie elementów niebędących Errorinstancjami (lub literałów ciągu) powoduje utratę śladu stosu. Wystarczy tylko drobiazg w powiązanym artykule: arguments.calleejest zabroniony w trybie ścisłym
Elias Van Ootegem,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.