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?
javascript
exception
Ilia Choly
la source
la source
new
.new Error()
mieux queError()
?Réponses:
Les deux vont bien; ceci est explicitement indiqué dans la spécification :
la source
Error
n'agit comme une usine, comme d'autres constructeurs indigènes:Array
,Object
, etc. tout contrôle quelque chose commeif (!(this instanceof Array)) { return new Array(arguments); }
. (Mais notez queString(x)
etnew String(x)
sont très différents, et de même pourNumber
etBoolean
.)Cela dit, en cas d'erreur, il n'est même pas nécessaire de lancer un
Error
objet ...throw 'Bad things happened';
fonctionnera aussiVous pouvez même lancer un objet littéral pour le débogage:
la source
String("abc")
ne crée pas d'String
objet, alors quenew String("abc")
fait.Object
=>Object('foo')
renvoie un objet string ... viens chose ce presque tous les constructeurs indigènes est un mauvais bit ...Number
,Boolean
,Date
,String
tous ne le font pas ...Array
,Object
etError
faire, maisEvent
et tous lesDOMxxxx
constructeurs -api lancent des erreursnew Array(arguments)
ne fait pas exactement ce queArray(1, 2, 3)
fait. Mais probablement je suis juste pinailleur :)Error
instances (ou des chaînes littérales) perd la trace de pile. Juste un petit choix sur l'article lié:arguments.callee
est interdit en mode strict