/ / Come potrebbe una variabile indefinita lanciare un errore di tipo? - javascript

Come può una variabile non definita lanciare un errore di tipo? - javascript

Ho un utente che sta ricevendo l'errore

TypeError: a is undefined

Sono confuso da come ciò possa accadere. Non hai tentato di accedere a una variabile non definita per generare un errore di riferimento? In quale situazione potrebbe generare un errore di tipo?

risposte:

4 per risposta № 1

Come sottolineato da @jgillich nella sua risposta, il seguente codice produce a TypeError su un undefined oggetto.

> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined

Per capire perché, possiamo fare riferimento alla sezione delle specifiche di ECMAScript 5.1 11.2.1 Accessors di proprietà. Siamo interessati al passaggio 5

5. Chiama CheckObjectCoercible (baseValue).

Nel nostro esempio, baseValue è il valore del riferimento a. Questo significa baseValue è undefined.

CheckObjectCoercible è definito in sezione 9.10

L'operazione astratta CheckObjectCoercible genera un errore se il suo argomento è un valore che non può essere convertito in un oggetto utilizzando ToObject. È definito dalla Tabella 15:

E possiamo vedere nella Tabella 15 che a TypeError è gettato per undefined e null valori.

Quindi il motivo per cui abbiamo un TypeErrorinvece di a ReferenceError è, come al solito, perché lo spec dice così!

Ci sono altri modi per ottenere un TypeError sopra undefinedin particolare Obiettare getta anche a TypeError per undefined.

Queste tre linee di codice producono TypeError: can"t convert undefined to object:

Object.defineProperties({}, undefined);
Object.prototype.toLocaleString.call(undefined);
Object.prototype.valueOf.call(undefined);

Anche se questa volta il messaggio è un po 'più chiaro.

Anche invocando direttamente undefined produce TypeError: undefined has no properties

undefined.foo();
undefined.x;

Tutto ciò è stato testato utilizzando Firefox 33.0a2 (Aurora).


2 per risposta № 2
> a
ReferenceError: a is not defined
> var a;
> a.x
TypeError: a is undefined