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

165
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 Errorfunciona como uma fábrica.

Qual está correto e por quê?

Ilia Choly
fonte
5
Todos os construtores nativos são definidos no ECMAScript, incluindo seu respectivo comportamento quando chamados sem new.
Eu Odeio preguiçoso
4
Veja também Quando é new Error()melhor que Error()?
Bergi 08/12/16

Respostas:

164

Ambos estão bem; isso é explicitamente declarado na especificação :

... Portanto, a chamada da função Error(…)é equivalente à expressão de criação do objeto new Error(…)com os mesmos argumentos.

pimvdb
fonte
7
Isso também é verdade no ES6?
paulmelnikow
4
Sim. Para documentos atuais, consulte: ecma-international.org/ecma-262/6.0/…
theUtherSide
@paulmelnikow - Sim. A compatibilidade com versões anteriores é a maior prioridade do TC39. O mantra é "não quebre a web".
TJ Crowder
17

Errorage como uma fábrica, como alguns outros construtores nativos: Array, Object, etc. todos os check algo como if (!(this instanceof Array)) { return new Array(arguments); }. (Mas observe que String(x)e new String(x)são muito diferentes e também para Numbere Boolean.)

Dito isto, em caso de erro, não é necessário nem mesmo lançar um Errorobjeto ... throw 'Bad things happened';funcionará também
Você pode até lançar um literal de objeto para depuração:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
Elias Van Ootegem
fonte
9
Receio não concordar totalmente. String("abc")não cria um Stringobjeto, enquanto cria new String("abc").
Pimvdb
2
@pimvdb: verdade, eu mudei-o para Object=> Object('foo')retorna um objeto String ... vir a coisa de que quase todos os construtores nativos é um pouco errado ... Number, Boolean, Date, Stringtudo não ... Array, Objecte Errorfazer, mas Evente todos os DOMxxxxconstrutores -api jogar erros
Elias Van Ootegem
Eu também acho new Array(arguments)que não faz exatamente o que Array(1, 2, 3)faz. Mas, provavelmente, eu estou apenas criticando :)
pimvdb
8
Complementar em relação às cordas jogando: Uma cadeia não é um erro
alex
11
@alex: concedido, jogar não Errorinstâ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
Elias Van Ootegem