throw Error ('msg') vs lancer une nouvelle erreur ('msg')

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

Quelle est la différence? En les regardant dans la console chromée, ils ont l'air identiques. Mêmes propriétés sur l'objet et même __proto__chaîne. Cela ressemble presque Errorà une usine.

Lequel est correct et pourquoi?

Ilia Choly
la source
5
Tous les constructeurs natifs sont définis dans ECMAScript, y compris leur comportement respectif lorsqu'ils sont appelés sans new.
Je déteste paresseux

Réponses:

165

Les deux vont bien; ceci est explicitement indiqué dans la spécification :

... Ainsi, l'appel de fonction Error(…)équivaut à l'expression de création d'objet new Error(…)avec les mêmes arguments.

pimvdb
la source
7
Est-ce également vrai dans ES6?
paulmelnikow
4
Oui. Pour les documents actuels, voir: ecma-international.org/ecma-262/6.0/…
theUtherSide
@paulmelnikow - Oui. La rétrocompatibilité est la priorité la plus élevée du TC39. Le mantra est «ne pas briser la toile».
TJ Crowder
17

Errorn'agit comme une usine, comme d'autres constructeurs indigènes: Array, Object, etc. tout contrôle quelque chose comme if (!(this instanceof Array)) { return new Array(arguments); }. (Mais notez que String(x)et new String(x)sont très différents, et de même pour Numberet Boolean.)

Cela dit, en cas d'erreur, il n'est même pas nécessaire de lancer un Errorobjet ... throw 'Bad things happened';fonctionnera aussi
Vous pouvez même lancer un objet littéral pour le débogage:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
Elias Van Ootegem
la source
9
J'ai peur de ne pas être entièrement d'accord. String("abc")ne crée pas d' Stringobjet, alors que new String("abc")fait.
pimvdb
2
@pimvdb: vrai, je l' ai changé à Object=> Object('foo')renvoie un objet string ... viens chose ce presque tous les constructeurs indigènes est un mauvais bit ... Number, Boolean, Date, Stringtous ne le font pas ... Array, Objectet Errorfaire, mais Eventet tous les DOMxxxxconstructeurs -api lancent des erreurs
Elias Van Ootegem
Je pense aussi new Array(arguments)ne fait pas exactement ce que Array(1, 2, 3)fait. Mais probablement je suis juste pinailleur :)
pimvdb
8
Complémentaire en ce qui concerne le lancement de chaînes: une chaîne n'est pas une erreur
alex
11
@alex: accordé, lancer des non- Errorinstances (ou des chaînes littérales) perd la trace de pile. Juste un petit choix sur l'article lié: arguments.calleeest interdit en mode strict
Elias Van Ootegem