JavaScript controlla se esiste una variabile (è definita / inizializzata)


1767

Quale metodo per verificare se una variabile è stata inizializzata è migliore / corretto? (Supponendo che la variabile possa contenere qualsiasi cosa (stringa, int, oggetto, funzione, ecc.))

if (elem) { // or !elem

o

if (typeof(elem) !== 'undefined') {

o

if (elem != null) {

5
se vuoi sapere se fooè stato dichiarato, typeof foo === 'undefined'oppuretypeof foo === typeof undefined

1
Le risposte altamente votate non funzionano per le variabili dichiarate ma che hanno il valore undefined. La risposta corretta è questa: stackoverflow.com/a/36432729/772035
Paul

@Paulpro, la versione che utilizza hasOwnProperty('bar')non ha le stesse carenze delle altre, ma richiederebbe qualche aggiustamento per Node (sostituisci windowcon global).
oligofren,

@Paulpro In effetti, ma mentre riflettevo sul fatto che prima che tu rispondessi, sono giunto alla conclusione che non è davvero un problema pratico. Quando hai a che fare con variabili con ambito blocco o funzione, di solito è un codice che possiedi o hai accesso in scrittura, quindi avrai comunque un errore di runtime che è riparabile. Considerando che il solito problema con le variabili che non sono state definite (non esiste) di solito risiede nel codice al di fuori del tuo controllo, quindi è necessario un modo per rilevarlo. Quindi è la soluzione 80/20.
oligofren,

Risposte:


3056

Vuoi l' typeofoperatore . In particolare:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
Questa sembra una buona soluzione, ma puoi spiegare perché funziona?
Morgan Cheng,

46
In realtà, dovresti verificare che l'oggetto sia quello che ti serve per essere. Quindi sarebbe se (typeof console == 'object') {// la variabile è ciò di cui ho bisogno per essere}
staticsan

59
@Gorgeorge IV: "fai solo" if (variabile) "- um, no, ciò fallisce per falso e 0.
Jason S,

17
'if (variabile)' non riesce anche a verificare l'esistenza di proprietà dell'oggetto.
scatta

54
@ geowa4 In realtà, ciò genererà un errore se la variabile non è definita.
kevinji,

857

L' typeofoperatore verificherà se la variabile non è veramente definita.

if (typeof variable === 'undefined') {
    // variable is undefined
}

L' typeofoperatore, a differenza degli altri operatori, non genera un'eccezione ReferenceError se utilizzato con una variabile non dichiarata.

Tuttavia, si noti che typeof nulltornerà "object". Dobbiamo stare attenti a evitare l'errore di inizializzare una variabile null. Per sicurezza, questo è ciò che potremmo usare invece:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Per maggiori informazioni sull'uso del confronto rigoroso ===anziché della semplice uguaglianza ==, vedi:
Quale operatore uguale (== vs ===) dovrebbe essere usato nei confronti JavaScript?


2
if (! variabile_here) {// il tuo codice qui. }; non so dire se la variabile è falsa o indefinita
boh

5
if(! variable_here)si romperà in molti casi. Se la variabile è 0 o false, fallirà. Non è quello che vuoi.
Cory Danielson,

2
non riesco a decidere se votare questo. A rigor di termini typeof foo === "undefined"è corretto, e migliore della risposta più votata, ma le note aggiuntive rendono questa risposta confusa.
Alnitak,

1
@StevenPenny Controlla la sequenza temporale. La risposta migliore è stata fusa da un'altra domanda dopo che questa risposta è stata pubblicata
Rob

1
Questa risposta non funziona. Questa è l'unica risposta qui che funziona: stackoverflow.com/a/36432729/772035
Paul

222

In molti casi, usando:

if (elem) { // or !elem

farà il lavoro per te! ... questo controllerà questi casi di seguito:

  1. undefined : se il valore non è definito ed èundefined
  2. null : se è null, ad esempio, se un elemento DOM non esiste ...
  3. stringa vuota :''
  4. 0 : numero zero
  5. NaN : non un numero
  6. falso

Quindi coprirà il genere di tutti i casi, ma ci sono sempre casi strani che vorremmo coprire anche, ad esempio, una stringa con spazi, come questa ' ', questa sarà definita in javascript poiché ha spazi all'interno della stringa ... ad esempio in questo caso aggiungi un altro controllo usando trim (), come:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

Inoltre, questi controlli sono solo per valori , poiché gli oggetti e le matrici funzionano in modo diverso in Javascript, gli array []vuoti e gli oggetti vuoti {}sono sempre veri .

Creo l'immagine qui sotto per mostrare un breve riassunto della risposta:

indefinito, nullo, ecc


2
@Alireza, bello! La tua risposta aiuterà molte persone là fuori. Ho già memorizzato questi valori falsi, l'unica cosa di cui non ero sicuro riguardava [].
Thiago Yoithi,

13
Ricevo un "ReferenceError: elem non è definito"
ropo

3
@ropo, è perché non hai nemmeno definito elem per verificare di cosa si tratta, se è il tuo caso, devi controllarlo con typeof (elem) === "stringa" che è già menzionato ...
Alireza

19
Quindi la risposta è fuorviante quando dice che if(elem)controlla se non è definito (mentre restituisce un errore non definito), vero?
Fanky

1
Mi dia un caso d'uso per verificare se una variabile non è definita e se è definita con un valore non definito? Alcuni di voi stanno afferrando la cannuccia e stanno cercando di apparire brillante ma se si sta impostando un valore come indefinito e controllando quel valore ovviamente restituirà falso o è necessario modificare il codice, smh .... questa risposta è corretta !! !!!
Almcaffee,

210

In JavaScript, è possibile definire una variabile, ma mantenere il valore undefined, quindi la risposta più comune non è tecnicamente corretta e invece esegue le seguenti operazioni:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

Questo potrebbe essere sufficiente per i tuoi scopi. Il seguente test ha una semantica più semplice, che semplifica la descrizione precisa del comportamento del codice e la sua comprensione (se ci tenete a tali cose):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

Questo, ovviamente, presuppone che tu sia in esecuzione in un browser (dove windowè un nome per l'oggetto globale). Ma se vai in giro con globi come questo, probabilmente sei in un browser. Soggettivamente, l'utilizzo 'name' in windowè stilisticamente coerente con l'uso window.nameper riferirsi ai globali. L'accesso ai globi come proprietà windowanziché come variabili consente di ridurre al minimo il numero di variabili non dichiarate a cui si fa riferimento nel proprio codice (a vantaggio della sfilacciatura) ed evitare la possibilità che il proprio globale venga oscurato da una variabile locale. Inoltre, se i globuli fanno strisciare la pelle, potresti sentirti più a tuo agio toccandoli solo con questo bastone relativamente lungo.


7
Questo controlla solo se la variabile è stata dichiarata a livello globale. Se stai codificando correttamente, allora stai limitando i tuoi parametri globali. Riferirà falso per i var locali: (function () {var sdfsfs = 10; console.log ("sdfsfs" nella finestra);}) () `
Eddie Monge Jr

2
Questa è la migliore risposta f $ # ^% ing. Ero alla fine con questo tentativo di capire come spiegare esattamente questo caso d'angolo. Brillante. Non avevo idea di poterlo fare.
temporaneo

1
Heads-up: la vostra risposta è stato migrato qui da stackoverflow.com/questions/519145/...
Shog9

Per gli utenti angolari: purtroppo, non sembra essere consentito in un'istruzione ng-if.
qwertzguy,

... progetto perfetto per controlli lungo l'ambito. hai qualche indicazione di prestazione, se "nella finestra" o "(typeof variabile === 'undefined' || variabile === null)". In realtà sono interessato a una prova concreta e non a una potenziale argomentazione (che potrei fare da solo: la seconda clausola ha più operazioni -> prestazioni peggiori)
Quicker

119

Nella maggior parte dei casi useresti:

elem != null

A differenza di un semplice if (elem), permette 0, false, NaNe '', ma scarti nullo undefined, rendendolo una buona, prova generale per la presenza di un argomento o una proprietà di un oggetto.


Anche gli altri controlli non sono errati, hanno solo usi diversi:

  • if (elem): Può essere utilizzato se elemviene garantita un oggetto, o se false, 0ecc sono considerati i valori di "default" (quindi equivalente undefinedo null).

  • typeof elem == 'undefined'può essere utilizzato nei casi in cui uno specificato nullha un significato distinto per una variabile o proprietà non inizializzata.

    • Questo è l'unico controllo che non genererà un errore se elemnon viene dichiarato (ovvero nessuna varistruzione, non una proprietà windowo un argomento della funzione). Questo, a mio avviso, è piuttosto pericoloso in quanto consente ai refusi di passare inosservati. Per evitare ciò, vedere il metodo seguente.

Utile anche un rigido confronto con undefined:

if (elem === undefined) ...

Tuttavia, poiché il globale undefinedpuò essere sostituito con un altro valore, è consigliabile dichiarare la variabile undefinednell'ambito corrente prima di utilizzarla:

var undefined; // really undefined
if (elem === undefined) ...

O:

(function (undefined) {
    if (elem === undefined) ...
})();

Un vantaggio secondario di questo metodo è che i minificatori JS possono ridurre la undefinedvariabile a un singolo carattere, facendoti risparmiare qualche byte ogni volta.


17
Sono scioccato che tu possa scavalcare undefined. Non penso nemmeno che valga la pena menzionare la risposta. Probabilmente il singolo peggior nome variabile accettabile in tutto Javascript.
Cory Danielson,

2
Ciò provoca un'eccezione e richiede l'utilizzo window.prima della variabile se utilizzato nel contesto globale ... questo non è il modo migliore.
Alex W,

4
A causa di questo problema prioritario, utilizzare SEMPRE void(0)invece di undefined.
Bartłomiej Zalewski,

+1 dato questa risposta fa notare che a volte si può effettivamente vuole identificare false, 0ecc come valori non validi.
Rinogo,

77

Controlla se window. hasOwnProperty( " varname" )

Un'alternativa alla pletora di typeofrisposte;

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 vardi "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 varper definire una variabile , al contrario del letquale:

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 letdifferenza 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 varvariabili. È 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 letvariabili o le constcostanti 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 indell'operatore, questo metodo non controlla la catena di prototipi dell'oggetto.


1
Questa è una fantastica alternativa e dovrebbe essere in cima alla classifica di questa domanda. Semplifica il titolo della risposta con un esempio funzionante che ritorni true(ad es. window.hasOwnProperty('console')O var hop = "p";window.hasOwnProperty('hop')).
CPHPython

2
Finalmente qualcosa che non genera un errore a causa dell'accesso a un membro che non esiste ... Qualcosa che tutte le typeofrisposte semplicemente trascurano.
Zelphir Kaltstahl

1
Questa risposta è obsoleta: per ECMAScript standard puoi definire le variabili con letcui queste variabili non sono disponibili come proprietà windowdell'oggetto [o di qualsiasi altro oggetto disponibile]. hasOwnPropertyverifica la presenza di proprietà , non variabili e quindi non può essere utilizzato per rilevare variabili definite da let.
AMN

1
@amn La risposta rimane vera riguardo all'uso di vared è al riguardo non datata. Ho comunque aggiunto una nota che illustra come l'uso lete constdifferisce da quello di var. Grazie per la tua ispirazione; insieme ci
alziamo

1
@amn Ho riscritto la risposta (si spera per l'ultima volta) per chiarire che hasOwnPropertypuò essere utilizzato solo nel modo prescritto per verificare l'esistenza di varvariabili. Per me va bene.
Fred Gandt,

68

Come verificare se esiste una variabile

Questa è una soluzione piuttosto a prova di proiettile per verificare se esiste una variabile ed è stata inizializzata:

var setOrNot = typeof variable !== typeof undefined;

È più comunemente usato in combinazione con un operatore ternario per impostare un valore predefinito nel caso in cui una determinata variabile non sia stata inizializzata:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

Problemi con l'incapsulamento

Sfortunatamente, non puoi semplicemente incapsulare il tuo controllo in una funzione.

Potresti pensare di fare qualcosa del genere:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Tuttavia, questo produrrà un errore di riferimento se si chiama ad es. isset(foo)e la variabile foonon è stata definita, poiché non è possibile passare una variabile inesistente a una funzione:

Errore di riferimento non rilevato: foo non è definito


Verifica se i parametri della funzione non sono definiti

Sebbene la nostra issetfunzione non possa essere utilizzata per verificare l'esistenza o meno di una variabile (per motivi illustrati in precedenza), ci consente di verificare se i parametri di una funzione non sono definiti:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Anche se nessun valore per yviene passato alla funzione test, la nostra issetfunzione funziona perfettamente in questo contesto, perché yè noto nella funzione testcome undefinedvalore.


41

Esiste un altro modo breve per verificarlo, quando si eseguono compiti semplici e controlli correlati. Basta usare l' operatore condizionale (ternario).

var values = typeof variable !== 'undefined' ? variable : '';

Inoltre, ciò sarà utile quando si tenta di dichiarare la variabile globale con l'assegnazione dell'istanza della variabile di riferimento.

Se si desidera controllare la variabile non dovrebbe essere undefinedo null. Quindi eseguire il controllo di seguito.

Quando viene dichiarata la variabile e se si desidera verificare il valore, questo è persino Semplice: e verrebbe eseguito undefinede nullverificato insieme.

var values = variable ? variable : '';

la risposta è completamente sbagliata. la variabile typeof restituisce sempre una stringa, quindi non è mai falsa. ad es. se typeof(booooo)è "undefined"allora typeof(typeof boooooo)è "string"ed typeof boooooo && trueè sempre true. @La risposta di John-Slegers è abbreviata quanto puoi ottenere con typeof.
mpag,

La sua risposta assolutamente corretta . Ecco un violino funzionante . E non so di quale scenario stai parlando. Le domande riguardano il controllo dell'esistenza variabile.
RajeshKdev,

@mpag Don't Say Flat wrong. Provalo . Trovare un errore è molto semplice, invece puoi fornire buone risposte qui !!!. Se la risposta fosse sbagliata, 28 programmatori non avrebbero votato senza controllare la mia risposta. Dal momento che ci sono molte risposte rinomate qui, avrebbero potuto votare questo, non questo.
RajeshKdev,

In realtà il secondo pezzo di codice, non è quello di verificare lo stesso come sopra condizione. Ho pensato che la gente avrebbe capito da questa linea If you wanted to check variable shouldn't be undefined or null., da questo commento, chiaramente affermando, non eseguire il controllo della dichiarazione variabile. questo è per controllare il valore variabile.
RajeshKdev,

1
il tuo secondo controllo fallirà con valore 0
Fareed Alnamrouti,

31

Il modo breve per testare una variabile non è dichiarato (non definito) è

if (typeof variable === "undefined") {
  ...
}

L'ho trovato utile per rilevare script in esecuzione all'esterno di un browser (non avendo dichiarato windowvariabile).


è questa la "via canonica" che è portatile?
Jason,

3
Questo è sbagliato. window.bar=undefinedè definito e impostato su un valore. La tua risposta non riesce a rilevare la differenza tra questo e se la variabile non esiste. Se lo facessi this.hasOwnProperty('bar')potrebbe aver funzionato.
oligofren,

questo codice non funziona e puoi verificarlo utilizzando qualsiasi console del browser
ha9u63ar,

1
Prendere in considerazione const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. La variabile xè definita ma viene restituito false ...
user2878850

29

Dipende se ti interessa solo che la variabile sia stata definita o se vuoi che abbia un valore significativo.

Controllare se il tipo non è definito verificherà se la variabile è stata ancora definita.

=== nullo !== nullcontrollerà solo se il valore della variabile è esattamente null.

== nullo != nullcontrollerà se il valore è undefinedo null.

if(value)verificherà se la variabile è undefined, null, 0, o una stringa vuota.


12

La risposta più alta è corretta, usa typeof.

Tuttavia, ciò che volevo sottolineare era che in JavaScript undefinedè mutevole (per qualche ragione empia). Quindi, semplicemente fare un controllo per varName !== undefinedha il potenziale di non tornare sempre come previsto, perché altre librerie potrebbero essere cambiate indefinite. Alcune risposte (@ skalee's, per esempio), sembrano preferire non utilizzarle typeof, e ciò potrebbe mettere nei guai.

Il "vecchio" modo di gestire ciò stava dichiarando indefinito come var per compensare l'eventuale muting / over-riding di undefined. Tuttavia, il modo migliore è ancora quello di utilizzare typeofperché ignorerà qualsiasi sostituzione undefinedda altro codice. Soprattutto se stai scrivendo codice per l'uso in natura dove chissà cos'altro potrebbe essere in esecuzione sulla pagina ...


1
Il punto è controverso, perché se varName non è definito varName !== undefined, causerà un ReferenceError. La mutabilità di undefinednon importa.
Wutaz,

Heads-up: la vostra risposta è stato migrato qui da stackoverflow.com/questions/519145/...
Shog9

1
Nelle versioni Javascript più recenti undefinedè una proprietà di sola lettura. Tuttavia, per essere a prova di proiettile è possibile utilizzare typeof mvVar === typeof void 0. void 0ritorna undefinedsempre.
kwarnke,

11
if (typeof console != "undefined") {    
   ...
}

O meglio

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Funziona in tutti i browser


3
Perché quest'ultimo è meglio secondo te?
skalee,

3
@skalee Sono d'accordo che quest'ultimo è meglio. Questo per la semplice ragione che controlli se i tipi sono quelli che desideri prima di usarli.
Broxzier,

Heads-up: la vostra risposta è stato migrato qui da stackoverflow.com/questions/519145/...
Shog9

9

Per contribuire al dibattito, se so che la variabile dovrebbe essere una stringa o un oggetto che preferisco sempre if (!variable), quindi controlla se è falsa. Questo può portare a un codice più pulito in modo che, ad esempio:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

.. potrebbe essere ridotto a:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


Questo non è ciò che l'OP ha chiesto. Se data.url è uguale alla ''tua soluzione lo considererebbe indefinito, quando in realtà è definito come contenente una stringa vuota.
Demonblack

Sono d'accordo non è quello che è stato chiesto, e hai ragione: la stringa vuota '' sarebbe considerata indefinita. Ma l'ho pubblicato perché pensavo potesse essere utile nel dibattito creato tra risposte diverse. E nell'esempio, così come in molti altri casi, vuoi solo stampare una stringa se c'è effettivamente contenuto, quindi va bene approfittare del fatto che javascript considera falsa sia stringa vuota che indefinita
de3

8

È difficile distinguere tra indefinito e nullo. Null è un valore che è possibile assegnare a una variabile quando si desidera indicare che la variabile non ha un valore particolare. Undefined è un valore speciale che sarà il valore predefinito delle variabili non assegnate.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
Sarebbe utile mostrare in linea l'output di ciascun avviso.
Demisx

@demisx Concordato, ma invece di suggerire la modifica, perché non farlo? L'opzione è lì per un motivo. Alcuni potrebbero considerarlo maleducato; Lo considero efficiente, quindi ho modificato personalmente la risposta (in attesa di revisione).
Fred Gandt,

1
@Fred - Ho esaminato la cronologia delle modifiche e posso indovinare il motivo per cui le tue modifiche sono state rifiutate ... piuttosto che aggiungere semplicemente righe per mostrare quale sarebbe stato l'output, come suggerito da Demisx, hai cambiato in modo significativo ciò che Jith aveva pubblicato.
Stephen P,

8

Null è un valore in JavaScript e typeof nullrestituisce"object"

Pertanto, la risposta accettata non funzionerà se si passano valori null. Se si passano valori null, è necessario aggiungere un ulteriore controllo per i valori null:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

Il controllo più affidabile "è definito" è con typeof

if (typeof elem === 'undefined')

Se stai solo cercando una variabile definita per assegnare un valore predefinito, per una riga di facile lettura puoi spesso farlo:

elem = elem || defaultElem;

Spesso va bene usare, vedi: Modo idiomatico per impostare il valore predefinito in JavaScript

C'è anche questo liner che usa la parola chiave typeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;


7

Per verificare se una variabile è stata dichiarata / impostata ho fatto questo trucco sporco.

Non ho trovato un modo per estrarre il codice in una funzione, anche con eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

Cosa intendi con "estrai il codice in una funzione"?
Melab,

7

Queste risposte (a parte la soluzione di Fred Gandt) sono tutte errate o incomplete.

Supponiamo che io abbia bisogno che io variableName;porti un undefinedvalore, e quindi è stato dichiarato in un modo tale var variableName;che significa che è già inizializzato ; - Come posso verificare se è già stato dichiarato?

O ancora meglio: come posso verificare immediatamente se "Book1.chapter22.paragraph37" esiste con una singola chiamata, ma non genera un errore di riferimento?

Lo facciamo utilizzando il più potente operatore JasvaScript, l' in dell'operatore .:

"[variable||property]" in [context||root] 
>> true||false

In tempi di popolarità di AJAX ho scritto un metodo (in seguito denominato) isNS () che è in grado di determinare se esiste lo spazio dei nomi, compresi test approfonditi per nomi di proprietà come "Book1.chapter22.paragraph37" e molto altro.

Ma dal momento che è stato precedentemente pubblicato e per la sua grande importanza merita di essere pubblicato in un thread separato, non lo posterò qui ma fornirò parole chiave ( javascript + isNS ) che ti aiuteranno a individuare il codice sorgente, supportato da tutto il spiegazioni necessarie.


1
L' inoperatore verifica solo l'esistenza delle proprietà e non tutte le variabili sono proprietà - conste le letdichiarazioni non sono (e constnon sono nemmeno, beh, variabili ).
AMN

1
conste letsono stati standardizzati con ECMAScript 2015, che è stato pubblicato più di 3 anni fa e da allora ha visto una buona adozione da parte dei soliti sospetti e oggi è usato piuttosto pervasivamente, oserei dire - ci sono più di 2 milioni di occorrenze di "const" su Github nei file JS .
AMN

Sì, "variabile" - esattamente. Ecco perché ho commentato la tua risposta, sottolineando che non è possibile utilizzare l' inoperatore per verificare in generale se esiste una variabile , perché "const and let non sono [proprietà]" - mentre in consteffetti si può dire che introduce un riferimento costante , come al contrario di un riferimento a una variabilelet , d'altra parte, in realtà introduce un riferimento a una variabile : in altre parole, è una variabile qualsiasi, e la tua risposta è errata nel implicare che puoi verificare se letesiste una variabile definita con usando l' inoperatore - non puoi.
AMN

La specifica ECMAScript 6 definisce il linguaggio JavaScript, non tu né un browser Web. Ecco perché si chiama specifica - specifica in modo inequivocabile la lingua. La tua risposta è nella migliore delle ipotesi obsoleta, nella peggiore delle ipotesi omette intenzionalmente ciò che ritieni irrilevante, mentre è molto pertinente. Citando la specifica collegata, "le dichiarazioni let e const definiscono le variabili". Questi costrutti non sono accessibili come proprietà windowdell'oggetto, non so come renderti più chiaro.
AMN

La risposta non copre tutti i casi di variabili. In particolare, non copre le variabili definite con la letparola chiave. Questo è tutto ciò che stavo sottolineando.
AMN

6

Nella particolare situazione descritta nella domanda,

typeof window.console === "undefined"

è identico a

window.console === undefined

Preferisco quest'ultima poiché è più corta.

Si noti che cerchiamo consolesolo nell'ambito globale (che è un windowoggetto in tutti i browser). In questa situazione particolare è desiderabile. Non vogliamoconsole definito altrove.

@BrianKelley nella sua grande risposta spiega i dettagli tecnici. Ho solo aggiunto delle conclusioni mancanti e le ho digerite in qualcosa di più facile da leggere.


Heads-up: la vostra risposta è stato migrato qui da stackoverflow.com/questions/519145/...
Shog9

2
Falso. quest'ultimo genera un'eccezione nella mia console.
John Ktejik,

6

Uso due modi diversi a seconda dell'oggetto.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

A volte non voglio valutare una stringa vuota come falsa, quindi uso questo caso

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

Se hai bisogno del contrario, nella prima istanza la variabile! Diventa !! variabile e nella funzione non valida === diventa! = E i nomi delle funzioni cambiano in notInvalid.


5

La mia preferenza è typeof(elem) != 'undefined' && elem != null.

Comunque tu scelga, considera di mettere la spunta in una funzione come questa

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

Se non sai che la variabile è dichiarata, continua con typeof (x) != 'undefined' && x != null;

Dove sai che la variabile è dichiarata ma potrebbe non esistere, puoi usare

existy(elem) && doSomething(elem);

La variabile che si sta controllando può essere talvolta una proprietà nidificata. Puoi usare prop || {} per scendere in riga controllando l'esistenza della proprietà in questione:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

Dopo ogni proprietà usa (... '|| {}'). NextProp in modo che una proprietà mancante non generi un errore.

Oppure potresti usare esisty come existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


Se lo metti in una funzione, è ridondante. typeof (x) != 'undefined' && x != nullè equivalente a x != nullquando xviene dichiarato.
Ry-

3

Dipende dalla situazione. Se stai cercando qualcosa che potrebbe o non potrebbe essere stato definito globalmente al di fuori del tuo codice (come forse jQuery) vuoi:

if (typeof(jQuery) != "undefined")

(Non c'è bisogno di una rigorosa uguaglianza lì, typeof restituisce sempre una stringa.) Ma se hai argomenti per una funzione che può o non può essere stata passata, saranno sempre definiti, ma nulli se omessi.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

Prova a prendere

Se la variabile non è stata definita affatto, è possibile verificarla senza eseguire il codice di interruzione utilizzando il blocco try-catch come segue (non è necessario use strictattivare la modalità)

BONUS: (riferendosi ad altre risposte) Perché ===è più chiaro di ==( fonte )

if (a == b)

Inserisci qui la descrizione dell'immagine

se (a === b)

Inserisci qui la descrizione dell'immagine


1
Cordiali saluti, (a == b) inserito nella griglia di Game of Life non era poi così eccitante.
johnsnails

1

Sono sorpreso che non sia stato ancora menzionato ...

qui ci sono un paio di varianti aggiuntive usando this['var_name']

il vantaggio dell'utilizzo di questo metodo che può essere utilizzato prima che venga definita una variabile.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

Questo è sbagliato. window.bar=undefinedè definito e impostato su un valore. La tua risposta non riesce a rilevare la differenza tra questo e se la variabile non esiste. Se lo facessi this.hasOwnProperty('bar')potrebbe aver funzionato.
oligofren,

0

È possibile utilizzare un blocco try ... catch come il seguente:

Uno svantaggio è che non puoi metterlo in una funzione in quanto genererebbe un ReferenceError

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.