Quando una variabile viene dichiarata senza che gli sia stato assegnato un valore, il suo valore iniziale è undefined
.
Come controlli se un valore è undefined
in JavaScript?
La risposta breve
Nei browser moderni puoi confrontare in sicurezza la variabile direttamente a undefined
:
Alcune persone si oppongono al confronto con undefined
perché i vecchi browser consentivano di riassegnare il suo valore in questo modo:
Dopo quella riassegnazione, confronto con undefined
direttamente non rileva più correttamente se a una variabile è stato assegnato un valore.
Tuttavia, questo comportamento è stato corretto nel 2009 con ECMAScript 5:
Nei browser moderni ” Non è più possibile riassegnare il valore globale undefined
.
E se avessi bisogno di supportare IE8 e versioni precedenti?
In generale, confrontando direttamente con un definito è ancora sicuro. Non cè motivo pratico per unapplicazione per riassegnare il valore di undefined
.
Thomas Eding lo dimostra con unanalogia convincente:
Se sei ancora preoccupato, ci sono due modi per controllare se un valore non è definito anche se il undefined
globale è stato sovrascritto.
Puoi usare il operatore void per ottenere il valore di undefined
. Funzionerà anche se il valore globale window.undefined
è stato sovrascritto:
Lo zero in questo esempio non “ha alcun significato speciale, potresti anche usare 1
o function(){}
. void(anything)
restituirà sempre undefined
.
In alternativa, puoi utilizzare loperatore typeof per verificare in sicurezza se un valore è stato assegnato. Invece di confrontare il valore globale undefined
, controlla se il valore “tipo s è” undefined “:
Tieni presente che questo è leggermente diverso dalle opzioni precedenti. Anche se name
non fosse stato dichiarato typeof
, sarebbe ancora “non definito”. Se confronti una variabile non dichiarata con undefined
o void(0)
, otterrai invece un ReferenceError.
Ma non “t usa direttamente void (0)
Evita di usare void(0)
o typeof x === "undefined"
letteralmente nel codice. Queste espressioni non sono autoesplicative e dovrebbero essere racchiuse in una funzione isUndefined come questa:
Molte librerie di utilità hanno già questa funzionalità incorporata, ad esempio cè un _.isUndefined
funzione in Underscore.js.