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 № 1Come 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 TypeError
invece di a ReferenceError
è, come al solito, perché lo spec dice così!
Ci sono altri modi per ottenere un TypeError
sopra undefined
in 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