Verifica se qualcosa non è indefinito in JavaScript


Risposte:


345

response[0] non è definito, controlla se è definito e quindi controlla il titolo della sua proprietà.

if(typeof response[0] !== 'undefined' && typeof response[0].title !== 'undefined'){
    //Do something
}

20
Nonostante il numero di voti, questo non è un buon modo per eseguire il controllo perché undefinednon è una parola chiave JavaScript (anche se tutti sembrano pensare che lo sia). Se lo desideri, puoi creare una variabile chiamata undefinede quindi questo controllo non sarà corretto. L'unico modo corretto è verificare (typeof myVar !== 'undefined').
BadHorsie,

4
@BadHorsie ha un senso, ho aggiornato la risposta con il tuo commento.
amosrivera,

1
Cosa succede se esiste una variabile e contiene la stringa che legge "non definito"?
TomeeS

@BadHorsie Il tuo argomento è falso. Perché dovrei ridefinire undefined?
Robert Siemer,

@amosrivera No, il suo commento non aveva senso. Hai peggiorato la tua risposta.
Robert Siemer,

39

Controlla se response[0]non è definito:

if(response[0] !== undefined) { ... }

Se hai ancora bisogno di controllare esplicitamente il titolo, fallo dopo il controllo iniziale:

if(response[0] !== undefined && response[0].title !== undefined){ ... }

35

Ho avuto problemi con tutti gli altri esempi di codice sopra. In Chrome, questa era la condizione che ha funzionato per me:

typeof possiblyUndefinedVariable !== "undefined"

Dovrò provarlo in altri browser e vedere come vanno le cose, suppongo.


2
Lo stesso - ho scoperto che undefineddoveva essere una stringa.
rimessa il

questo deve essere qualcosa di nuovo con Chrome (sto vincendo Chrome 41 atm). la risposta accettata funzionava bene! : P
joe

13

In realtà è necessario circondarlo con un blocco Try / Catch in modo che il codice non smetta di funzionare. Come questo:

try{
    if(typeof response[0].title !== 'undefined') {
        doSomething();
    }
  }catch(e){
    console.log('responde[0].title is undefined'); 
  }

Stavo guardando IE 8 e avevo bisogno di provare.
RonanOD,

1
questo è il modo migliore se stai testando se una funzione non è definita
edepperson

gettare un errore per controllare undefined non è una buona soluzione. @amosrivera è la soluzione migliore.
user3658423

@ user3658423: non sta generando un errore. Impedisce l'arresto dello script solo se la risposta non è dichiarata (poiché ciò genererebbe un errore).
André Luiz,

A volte gli errori possono essere utili. Con la soluzione proposta, se doSomething () genera un'eccezione, tutto ciò che vedresti nella tua console è "responde [0] .title non definito", invece di un messaggio utile su una "eccezione non rilevata @ riga 123 del file xyz js". Alla fine un secondo sviluppatore probabilmente commenterà l'istruzione console.log (), rendendo più difficile per un terzo sviluppatore entrare e risolvere un bug che si verifica in profondità all'interno di doSomething ().
Eric Seastrand,




0

Controlla se sei response[0]effettivamente esistente, l'errore sembra suggerire che non lo sia.


0

È innanzitutto necessario verificare se response[0]non è definito e, in caso contrario, verificare il resto. Ciò significa che nel tuo caso response[0]non è definito.


0

So di essere arrivato qui con 7 mesi di ritardo, ma ho trovato questa domanda e sembra interessante. Ho provato questo sulla mia console del browser.

try{x,true}catch(e){false}

Se la variabile x non è definita, l'errore viene rilevato e sarà falso, altrimenti restituirà vero. Quindi puoi usare la funzione eval per impostare il valore su una variabile

var isxdefined = eval('try{x,true}catch(e){false}')

1
Un approccio interessante se potessi dirlo anche io.
Brandito,

0

In alcune di queste risposte c'è un malinteso fondamentale su come usare typeof.

scorretto

if (typeof myVar === undefined) {

Corretta

if (typeof myVar === 'undefined') {

Il motivo è che typeofrestituisce una stringa. Pertanto, dovresti verificare che abbia restituito la stringa "non definita" anziché undefined(non racchiusa tra virgolette), che è esso stesso uno dei tipi primitivi di JavaScript . L' typeofoperatore non restituirà mai un valore di tipo undefined.


appendice

Il tuo codice potrebbe tecnicamente funzionare se usi un confronto errato, ma probabilmente non per il motivo che pensi. Non esiste una undefinedvariabile preesistente in JavaScript - non è una sorta di parola chiave magica con cui puoi confrontare le cose. Puoi effettivamente creare una variabile chiamata undefinede dargli qualsiasi valore che ti piace.

let undefined = 42;

Ed ecco un esempio di come puoi usarlo per dimostrare che il primo metodo non è corretto:

https://jsfiddle.net/p6zha5dm/

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.