Tester si quelque chose n'est pas indéfini en JavaScript

Réponses:

344

response[0] n'est pas défini, vérifiez s'il est défini, puis vérifiez son titre de propriété.

if(typeof response[0] !== 'undefined' && typeof response[0].title !== 'undefined'){
    //Do something
}
amosrivera
la source
20
Malgré le nombre de votes, ce n'est pas un bon moyen d'effectuer la vérification car ce undefinedn'est pas un mot-clé JavaScript (bien que tout le monde semble le croire). Si vous le souhaitez, vous pouvez créer une variable appelée undefinedet cette vérification sera incorrecte. La seule façon correcte est de vérifier (typeof myVar !== 'undefined').
BadHorsie
4
@BadHorsie est logique, j'ai mis à jour la réponse avec votre commentaire.
amosrivera
1
Que se passe-t-il si une variable existe et contient la chaîne qui se lit «non défini»?
TomeeNS
1
@BadHorsie Votre argument est faux. Pourquoi devrais-je redéfinir undefined?
Robert Siemer
1
@amosrivera Non, son commentaire n'a pas de sens. Vous avez aggravé votre réponse.
Robert Siemer
40

Vérifiez simplement si ce response[0]n'est pas défini:

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

Si vous devez toujours vérifier explicitement le titre, faites-le après la vérification initiale:

if(response[0] !== undefined && response[0].title !== undefined){ ... }
Rion Williams
la source
35

J'ai eu des problèmes avec tous les autres exemples de code ci-dessus. Dans Chrome, c'était la condition qui fonctionnait pour moi:

typeof possiblyUndefinedVariable !== "undefined"

Je vais devoir tester cela dans d'autres navigateurs et voir comment ça se passe, je suppose.

Karl Henselin
la source
2
Idem - j'ai trouvé que ce undefineddevait être une chaîne.
remarsh
cela doit être quelque chose de nouveau avec le chrome (je suis sur win chrome 41 atm). la réponse acceptée fonctionnait très bien! : P
joe
13

En fait, vous devez l'entourer d'un bloc Try / Catch pour que votre code ne s'arrête pas de fonctionner. Comme ça:

try{
    if(typeof response[0].title !== 'undefined') {
        doSomething();
    }
  }catch(e){
    console.log('responde[0].title is undefined'); 
  }
André Luiz
la source
Je regardais IE 8 et je devais faire un essai.
RonanOD
1
c'est le meilleur moyen si vous testez si une fonction n'est pas définie
edepperson
lancer une erreur pour vérifier undefined n'est pas une bonne solution. @amosrivera est la meilleure solution.
user3658423
@ user3658423: Il ne génère pas d'erreur. Il empêche uniquement le script de s'arrêter si la réponse n'est pas déclarée (car cela déclencherait une erreur).
André Luiz
Parfois, les erreurs peuvent être utiles. Avec votre solution proposée, si doSomething () lève une exception, tout ce que vous verrez dans votre console est "responde [0] .title is undefined", au lieu d'un message utile concernant une "exception non interceptée @ ligne 123 du fichier xyz .js ". Finalement, un deuxième développeur commentera probablement l'instruction console.log (), ce qui rendra plus difficile pour un troisième développeur de venir corriger un bogue se produisant profondément dans doSomething ().
Eric Seastrand
9

Type de:

var foo;
if (typeof foo == "undefined"){
  //do stuff
}
Jeffrey Mark Baldridge
la source
1

Ce sera parce que response[0]lui-même n'est pas défini.

DavidGouge
la source
1

Vérifiez si condition == null; Cela résoudra le problème

Tanmay Chandra
la source
1
Cela devrait être un commentaire
ρяσѕρєя K
0

Vérifiez si vous response[0]existe réellement, l'erreur semble suggérer que ce n'est pas le cas.

Exelian
la source
0

Vous devez d'abord vérifier si ce response[0]n'est pas défini, et seulement si ce n'est pas le cas, vérifiez le reste. Cela signifie que dans votre cas, response[0]n'est pas défini.

Alex Turpin
la source
0

Je sais que je suis allé ici 7 mois en retard, mais j'ai trouvé ces questions et cela semble intéressant. J'ai essayé cela sur ma console de navigateur.

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

Si la variable x n'est pas définie, une erreur est interceptée et elle sera fausse, sinon, elle renverra true. Vous pouvez donc utiliser la fonction eval pour définir la valeur d'une variable

var isxdefined = eval('try{x,true}catch(e){false}')
AngeLOL
la source
1
Une approche intéressante si je puis dire moi-même.
Brandito
0

Dans certaines de ces réponses, il y a un malentendu fondamental sur la façon d'utiliser typeof.

Incorrect

if (typeof myVar === undefined) {

Correct

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

La raison en est que typeofrenvoie une chaîne. Par conséquent, vous devez vérifier qu'il a renvoyé la chaîne "non définie" plutôt que undefined(non placée entre guillemets), qui est elle-même l'un des types primitifs de JavaScript . L' typeofopérateur ne renverra jamais une valeur de type undefined.


Addenda

Votre code peut techniquement fonctionner si vous utilisez la comparaison incorrecte, mais probablement pas pour la raison que vous pensez. Il n'y a pas de undefinedvariable préexistante en JavaScript - ce n'est pas une sorte de mot-clé magique auquel vous pouvez comparer les choses. Vous pouvez réellement créer une variable appelée undefinedet lui donner la valeur que vous souhaitez.

let undefined = 42;

Et voici un exemple de la façon dont vous pouvez utiliser cela pour prouver que la première méthode est incorrecte:

https://jsfiddle.net/p6zha5dm/

BadHorsie
la source