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é?


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.


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'};

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.