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

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

Was ist der Unterschied? Wenn man sie in der Chromkonsole betrachtet, sehen sie identisch aus. Gleiche Eigenschaften für das Objekt und dieselbe __proto__Kette. Scheint fast Errorwie eine Fabrik zu handeln.

Welches ist richtig und warum?

Ilia Choly
quelle
5
Alle nativen Konstruktoren sind in ECMAScript definiert, einschließlich ihres jeweiligen Verhaltens beim Aufrufen ohne new.
Ich hasse faul

Antworten:

164

Beide sind gut; Dies wird ausdrücklich in der Spezifikation angegeben :

... Somit entspricht der Funktionsaufruf Error(…)dem Objekterstellungsausdruck new Error(…)mit denselben Argumenten.

pimvdb
quelle
7
Gilt das auch für ES6?
Paulmelnikow
4
Ja. Aktuelle Dokumente finden Sie unter: ecma-international.org/ecma-262/6.0/…
theUtherSide
@ Paulmelnikow - Ja. Die Abwärtskompatibilität hat für TC39 höchste Priorität. Das Mantra lautet "Mach das Web nicht kaputt".
TJ Crowder
17

Errorwirkt wie eine Fabrik, wie einige andere einheimische Bauer: Array, Objectusw. Sie alle Kontroll so etwas wie if (!(this instanceof Array)) { return new Array(arguments); }. (Aber beachte, dass String(x)und new String(x)sehr unterschiedlich sind, und ebenso für Numberund Boolean.)

Das heißt, im Fehlerfall ist es nicht einmal erforderlich, ein ErrorObjekt zu werfen ... throw 'Bad things happened';funktioniert auch.
Sie können sogar ein Objektliteral zum Debuggen werfen:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
Elias Van Ootegem
quelle
9
Ich fürchte, ich stimme nicht ganz zu. String("abc")erstellt kein StringObjekt, wohingegen dies der new String("abc")Fall ist.
Pimvdb
2
@pimvdb: true, ich habe es geändert Object=> Object('foo')Gibt ein String - Objekt ... kommen , um etwas davon fast alle einheimischen Bauer ist ein bisschen falsch ... Number, Boolean, Date, Stringalle nicht ... Array, Objectund Errortun, aber Eventund alle DOMxxxx-api Konstruktoren werfen Fehler
Elias Van Ootegem
Ich denke auch, new Array(arguments)macht nicht genau das, was Array(1, 2, 3)macht. Aber wahrscheinlich bin ich nur nitpicking :)
pimvdb
8
Komplementär in Bezug auf das Werfen von Strings: Ein String ist kein Fehler
Alex
11
@alex: Zugegeben, das Auslösen von Nichtinstanzen Error(oder String-Literalen) verliert die Stapelverfolgung. Nur eine Kleinigkeit zu dem verlinkten Artikel: arguments.calleeist im strengen Modus verboten
Elias Van Ootegem