Un'alternativa alla pletora di typeof
risposte;
Variabili globali dichiarate con var varname = value;
un'istruzione nell'ambito globale
è possibile accedere come proprietà dell'oggetto finestra.
Come tale, il hasOwnProperty()
metodo, che
restituisce un valore booleano che indica se l'oggetto ha la proprietà specificata come propria proprietà (anziché ereditarla)
può essere usato per determinare se
a var
di "varname" è stato dichiarato a livello globale, ovvero è una proprietà di window
.
// Globally established, therefore, properties of window
var foo = "whatever", // string
bar = false, // bool
baz; // undefined
// window.qux does not exist
console.log( [
window.hasOwnProperty( "foo" ), // true
window.hasOwnProperty( "bar" ), // true
window.hasOwnProperty( "baz" ), // true
window.hasOwnProperty( "qux" ) // false
] );
La cosa grandiosa hasOwnProperty()
è che nel chiamarlo non usiamo una variabile che potrebbe non essere ancora dichiarata - che ovviamente è la metà del problema in primo luogo.
Sebbene non sia sempre la soluzione perfetta o ideale , in determinate circostanze, è solo il lavoro!
Appunti
Quanto sopra è vero quando si utilizza var
per definire una variabile , al contrario del let
quale:
dichiara una variabile locale dell'ambito del blocco, inizializzandola facoltativamente su un valore.
è diverso dal var
parola chiave, che definisce una variabile a livello globale o localmente a un'intera funzione indipendentemente dall'ambito del blocco.
Al livello superiore di programmi e funzioni, a let
differenza di var
, non crea una proprietà sull'oggetto globale.
Per completezza: le const
costanti sono, per definizione, in realtà non variabili (sebbene il loro contenuto possa essere); più pertinente:
Le costanti globali non diventano proprietà dell'oggetto finestra, a differenza delle var
variabili. È richiesto un inizializzatore per una costante; cioè, è necessario specificare il suo valore nella stessa istruzione in cui è dichiarato.
Il valore di una costante non può cambiare attraverso la riassegnazione e non può essere nuovamente dichiarato.
La dichiarazione const crea un riferimento di sola lettura a un valore. Non significa che il valore che detiene sia immutabile, ma solo che l'identificatore di variabile non può essere riassegnato.
Poiché le let
variabili o le const
costanti non sono mai proprietà di alcun oggetto che ha ereditato il hasOwnProperty()
metodo, non può essere utilizzato per verificarne l'esistenza.
Per quanto riguarda la disponibilità e l'uso di hasOwnProperty()
:
Ogni oggetto discendente da Object eredita il hasOwnProperty()
metodo. [...] a differenza in
dell'operatore, questo metodo non controlla la catena di prototipi dell'oggetto.
foo
è stato dichiarato,typeof foo === 'undefined'
oppuretypeof foo === typeof undefined