var err1 = Error('message');
var err2 = new Error('message');
Qual é a diferença? Olhando para eles no console do Chrome, eles parecem idênticos. As mesmas propriedades no objeto e a mesma __proto__
cadeia. Quase parece que Error
funciona como uma fábrica.
Qual está correto e por quê?
javascript
exception
Ilia Choly
fonte
fonte
new
.new Error()
melhor queError()
?Respostas:
Ambos estão bem; isso é explicitamente declarado na especificação :
fonte
Error
age como uma fábrica, como alguns outros construtores nativos:Array
,Object
, etc. todos os check algo comoif (!(this instanceof Array)) { return new Array(arguments); }
. (Mas observe queString(x)
enew String(x)
são muito diferentes e também paraNumber
eBoolean
.)Dito isto, em caso de erro, não é necessário nem mesmo lançar um
Error
objeto ...throw 'Bad things happened';
funcionará tambémVocê pode até lançar um literal de objeto para depuração:
fonte
String("abc")
não cria umString
objeto, enquanto crianew String("abc")
.Object
=>Object('foo')
retorna um objeto String ... vir a coisa de que quase todos os construtores nativos é um pouco errado ...Number
,Boolean
,Date
,String
tudo não ...Array
,Object
eError
fazer, masEvent
e todos osDOMxxxx
construtores -api jogar errosnew Array(arguments)
que não faz exatamente o queArray(1, 2, 3)
faz. Mas, provavelmente, eu estou apenas criticando :)Error
instâncias (ou literais de seqüência de caracteres) perde o rastreamento de pilha. Apenas um nit-pick sobre o artigo ligado:arguments.callee
é proibido no modo estrito