Penso che il modo più efficace per verificare "il valore sia null
o undefined
" sia
if ( some_variable == null ){
// some_variable is either null or undefined
}
Quindi queste due linee sono equivalenti:
if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}
Nota 1
Come menzionato nella domanda, la breve variante richiede che some_variable
sia stata dichiarata, altrimenti verrà lanciato un ReferenceError. Tuttavia, in molti casi d'uso puoi presumere che sia sicuro:
verifica argomenti opzionali:
function(foo){
if( foo == null ) {...}
controlla le proprietà di un oggetto esistente
if(my_obj.foo == null) {...}
D'altra parte typeof
può gestire variabili globali non dichiarate (semplicemente restituisce undefined
). Tuttavia, questi casi dovrebbero essere ridotti al minimo per buoni motivi, come spiegato da Alsciende.
Nota 2
Questa variante, anche più breve, non è equivalente:
if ( !some_variable ) {
// some_variable is either null, undefined, 0, NaN, false, or an empty string
}
così
if ( some_variable ) {
// we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}
Nota 3
In generale si consiglia di utilizzare ===
anziché ==
. La soluzione proposta è un'eccezione a questa regola. Il checker di sintassi JSHint fornisce anche l' eqnull
opzione per questo motivo.
Dalla guida di stile jQuery :
Controlli rigorosi sull'uguaglianza (===) dovrebbero essere usati a favore di ==. L'unica eccezione riguarda il controllo di undefined e null mediante null.
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
if(some_variable) { ... }
non verrà eseguito sesome_variable
èfalse
o0
o ...