genera un errore ("msg") e genera un nuovo errore ("msg")


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

Qual è la differenza? Guardandoli nella console di Chrome, sembrano identici. Stesse proprietà sull'oggetto e la stessa __proto__catena. Sembra quasi che si Errorcomporti come una fabbrica.

Quale è corretto e perché?


5
Tutti i costruttori nativi sono definiti in ECMAScript, incluso il loro rispettivo comportamento se richiamati senza new.
Odio Lazy l'

Risposte:


164

Entrambi vanno bene; questo è esplicitamente dichiarato nelle specifiche :

... Quindi la chiamata di funzione Error(…)equivale all'espressione di creazione dell'oggetto new Error(…)con gli stessi argomenti.


7
È vero anche in ES6?
paulmelnikow,


@paulmelnikow - Sì. La compatibilità con le versioni precedenti è la massima priorità di TC39. Il mantra è "non rompere il web".
TJ Crowder,

17

Errornon agire come una fabbrica, come alcuni altri costruttori nativi: Array, Object, ecc tutti spunta qualcosa di simile if (!(this instanceof Array)) { return new Array(arguments); }. (Ma nota che String(x)e new String(x)sono molto diversi, e allo stesso modo per Numbere Boolean.)

Detto questo, in caso di errore, non è nemmeno necessario lanciare un Erroroggetto ... throw 'Bad things happened';funzionerà anche
Puoi anche lanciare un oggetto letterale per il debug:

throw {message:"You've been a naughty boy",
       context: this,
       args: arguments,
       more:'More custom info here'};

9
Temo di non essere pienamente d'accordo. String("abc")non crea un Stringoggetto, mentre lo new String("abc")fa.
pimvdb,

2
@pimvdb: vero, ho cambiato in Object=> Object('foo')restituisce un oggetto stringa ... vengo a cosa di esso quasi tutti i costruttori nativi è un po 'sbagliato ... Number, Boolean, Date, Stringnon tutti ... Array, Objecte Errorfare, ma Evente tutti i DOMxxxxcostruttori -api generano errori
Elias Van Ootegem,

Penso anche che new Array(arguments)non faccia esattamente ciò che Array(1, 2, 3)fa. Ma probabilmente sto solo scherzando :)
pimvdb

8
Complementare per quanto riguarda il lancio di stringhe: una stringa non è un errore
alex

11
@alex: Concesso, il lancio di non Erroristanze (o letterali stringa) perde la traccia dello stack. Solo un pignolo sull'articolo collegato: arguments.calleeè vietato in modalità rigorosa
Elias Van Ootegem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.