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 Error
actúa como una fábrica.
¿Cuál es correcto y por qué?
javascript
exception
Ilia Choly
fuente
fuente
new
.new Error()
mejor queError()
?Respuestas:
Ambos están bien; esto se establece explícitamente en la especificación :
fuente
Error
no 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 queString(x)
ynew String(x)
son muy diferentes, y del mismo modo paraNumber
yBoolean
.)Dicho esto, en caso de error, ni siquiera es necesario lanzar un
Error
objeto ...throw 'Bad things happened';
también funcionará.Incluso puede lanzar un objeto literal para la depuración:
fuente
String("abc")
no crea unString
objeto, mientras que lonew String("abc")
hace.Object
=>Object('foo')
Devuelve un objeto cadena ... vamos a lo de que casi todos los constructores nativos está un poco mal ...Number
,Boolean
,Date
,String
no todos ...Array
,Object
yError
hacer, peroEvent
y todos losDOMxxxx
constructores -api arrojan erroresnew Array(arguments)
que no hace exactamente lo queArray(1, 2, 3)
hace. Pero probablemente solo estoy siendo quisquilloso :)Error
instancias (o literales de cadena) pierde el seguimiento de la pila. Solo una trampa en el artículo vinculado:arguments.callee
está prohibido en modo estricto