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é?
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
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 queString(x)ynew String(x)son muy diferentes, y del mismo modo paraNumberyBoolean.)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:
fuente
String("abc")no crea unStringobjeto, 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,Stringno todos ...Array,ObjectyErrorhacer, peroEventy todos losDOMxxxxconstructores -api arrojan erroresnew Array(arguments)que no hace exactamente lo queArray(1, 2, 3)hace. Pero probablemente solo estoy siendo quisquilloso :)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