Lanzar error ('msg') vs lanzar nuevo error ('msg')

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

¿Cual es la diferencia? Mirándolos en la consola cromada, se ven idénticos. Las mismas propiedades en el objeto y la misma __proto__cadena. Casi parece que Erroractúa como una fábrica.

¿Cuál es correcto y por qué?

Ilia Choly
fuente
55
Todos los constructores nativos se definen en ECMAScript, incluido su comportamiento respectivo cuando se invocan sin él new.
Odio a los perezosos el

Respuestas:

164

Ambos están bien; esto se establece explícitamente en la especificación :

... Por lo tanto, la llamada a la función Error(…)es equivalente a la expresión de creación de objetos new Error(…)con los mismos argumentos.

pimvdb
fuente
77
¿Es esto cierto también en ES6?
paulmelnikow
44
Si. Para ver los documentos actuales, consulte: ecma-international.org/ecma-262/6.0/…
theUtherSide
@paulmelnikow - Sí. La compatibilidad con versiones anteriores es la máxima prioridad de TC39. El mantra es "no rompas la red".
TJ Crowder
17

Errorno actuar como una fábrica, al igual que algunos otros constructores nativos: Array, Object, etc, todo cheque algo así if (!(this instanceof Array)) { return new Array(arguments); }. (Pero tenga en cuenta que String(x)y new String(x)son muy diferentes, y del mismo modo para Numbery Boolean.)

Dicho esto, en caso de error, ni siquiera es necesario lanzar un Errorobjeto ... throw 'Bad things happened';también funcionará.
Incluso puede lanzar un objeto literal para la depuración:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};
Elias Van Ootegem
fuente
9
Me temo que no estoy totalmente de acuerdo. String("abc")no crea un Stringobjeto, mientras que lo new String("abc")hace.
pimvdb
2
@pimvdb: verdad, me he cambiado a Object=> Object('foo')Devuelve un objeto cadena ... vamos a lo de que casi todos los constructores nativos está un poco mal ... Number, Boolean, Date, Stringno todos ... Array, Objecty Errorhacer, pero Eventy todos los DOMxxxxconstructores -api arrojan errores
Elias Van Ootegem
También creo new Array(arguments)que no hace exactamente lo que Array(1, 2, 3)hace. Pero probablemente solo estoy siendo quisquilloso :)
pimvdb
8
Complementario con respecto al lanzamiento de cadenas: una cadena no es un error
alex
11
@alex: De acuerdo, arrojar no Errorinstancias (o literales de cadena) pierde el seguimiento de la pila. Solo una trampa en el artículo vinculado: arguments.calleeestá prohibido en modo estricto
Elias Van Ootegem