Vérifier si l'objet existe en JavaScript

314

Comment vérifier l'existence d'un objet en JavaScript?

Les oeuvres suivantes:

if (!null)
   alert("GOT HERE");

Mais cela jette une erreur:

if (!maybeObject)
   alert("GOT HERE");

L'erreur:

maybeObject n'est pas défini.

Yarin
la source

Réponses:

579

Vous pouvez utiliser en toute sécurité l' typeofopérateur sur des variables non définies.

Si une valeur lui a été affectée, y compris null, typeof renverra autre chose qu'undefined. typeof renvoie toujours une chaîne.

Par conséquent

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}
JAL
la source
73
si c'est toujours une chaîne, vous pourriez vraiment (devriez) faire !==pour la comparaison.
Micah
9
Puisqu'il s'agit d'une fonctionnalité Javascript de base, il est dommage qu'il n'y ait pas de meilleur intégré et moins sujet aux erreurs. La comparaison de chaînes empêche le compilateur de nous dire de manière fiable à 100% quand nous avons fait une petite erreur (comme une faute de frappe) dans ce type de vérification.
Domi
dans mon cas, je cherche à rechercher cet objet, donc cela n'aide pas. je veux une solution que je peux utiliser dans la console comme wel, pour voir si l'objet est dans domtree quelque part sans aucun clickery ..
blamb
@TJCrowder Ces exemples ne semblent plus être accessibles.
Stefan van den Akker
1
@StefanvandenAkker: Le lien vers le mauvais exemple devrait être jsbin.com/ibeho3/1 . Le bon exemple était bien: jsbin.com/ibeho3/2 . (Malheureusement, JSBin redirige vers la dernière version, et les gens l'ont modifiée jusqu'à un pouce de sa vie.)
TJ Crowder
48

Il y a beaucoup de demi-vérités ici, alors j'ai pensé clarifier certaines choses.

En fait, vous ne pouvez pas dire avec précision si une variable existe (sauf si vous voulez encapsuler toutes les deux lignes dans un bloc try-catch).

La raison en est que Javascript a cette valeur notoire undefinedqui, de façon frappante, ne signifie pas que la variable n'est pas définie ou qu'elle n'existe pasundefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

Donc, à la fois une variable qui existe et une autre qui ne peut pas vous signaler le undefined type.

Quant à l'idée fausse @ Kevin, null == undefined. Cela est dû à la coercition de type, et c'est la principale raison pour laquelle Crockford continue de dire à tous ceux qui ne sont pas sûrs de ce genre de chose de toujours utiliser un opérateur d'égalité stricte ===pour tester les valeurs éventuellement fausses. null !== undefinedvous donne ce que vous attendez. Veuillez également noter que cela foo != nullpeut être un moyen efficace de vérifier si une variable n'est ni undefinedni null. Bien sûr, vous pouvez être explicite, car cela peut aider à la lisibilité.

Si vous limitez la question pour vérifier si un objet existe, cela typeof o == "object"peut être une bonne idée, sauf si vous ne considérez pas les objets tableaux, car cela sera également signalé comme étant le type de objectce qui peut vous laisser un peu confus. Sans oublier que typeof nullcela vous donnera également ce objectqui est tout simplement faux.

La zone primaire où vous devriez vraiment faire attention typeof, undefined, null, unknownet d' autres sont des objets mystères hôtes. On ne peut pas leur faire confiance. Ils sont libres de faire presque n'importe quelle chose sale qu'ils veulent. Soyez donc prudent avec eux, vérifiez les fonctionnalités si vous le pouvez, car c'est le seul moyen sécurisé d'utiliser une fonctionnalité qui n'existe peut-être même pas.

gblazex
la source
5
Faire simplement foo!=nullproduira une ReferenceError si elle foon'est pas définie. Il est donc préférable de l'utiliser typeof, sauf si vous prévoyez d'attraper l'exception.
JAL
1
Je vous l'écris à nouveau: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . Je n'ai pas dit qu'il != nullest bon de vérifier s'il existe. Vous le sortez de son contexte. (J'ai également mentionné qu'il s'agit d'un sidenote, pas strictement lié au sujet de la question du PO)
gblazex
2
Vous confondez à nouveau le terme non défini avec le type undefined. Ils ne sont pas les mêmes. (note) it can be used !== you should use. Faites preuve de bon sens pendant la lecture. Lorsque la variable est déclarée (liste de paramètres ou ailleurs) et que vous voulez vérifier si elle a une valeur, !=null est complètement sûr. C'est un cas d'utilisation différent de ce que le PO a demandé, c'est pourquoi je l'ai introduit comme une note. Le paragraphe entier concerne le poste de @ Kevin et le type coercition btw. Comme vous pouvez le constater si vous lisez attentivement.
gblazex
@JAL il vous manque la partie avec laquelle vous ne risquez pas une erreur != nulllorsque vous savez que la variable a été déclarée. Ceci est très utile pour vérifier les arguments des fonctions, considérez:var hasValue = function(foo) {return foo != null}
tybro0103
@ tybro0103 c'est vrai, mais tout le problème est "Comment puis-je vérifier l'existence d'un objet en JavaScript?". Si vous êtes certain qu'il a été déclaré, c'est une situation différente.
JAL
12

Vous pouvez utiliser:

if (typeof objectName == 'object') {
    //do something
}
Calvin
la source
8

Deux manières.

typeof pour les variables locales

Vous pouvez tester un objet local en utilisant typeof:

if (typeof object !== "undefined") {}

fenêtre pour les variables globales

Vous pouvez tester un objet global (celui défini sur la portée globale) en inspectant l'objet window:

if (window.FormData) {}
superluminaire
la source
7

Si c'est un objet global, vous pouvez utiliser if (!window.maybeObject)

Nikita Rybak
la source
Je trouve que window.hasOwnProperty('maybeObject')c'est un peu plus lisible, si c'est un objet global
Nathaniel Rogers
5

Vous pouvez utiliser "typeof".

if(typeof maybeObject != "undefined")
    alert("GOT HERE");
RussellUresti
la source
4

Le fil a été ouvert il y a un certain temps. Je pense que dans l'intervalle, l'utilisation d'un opérateur ternaire est l'option la plus simple:

maybeObject ? console.log(maybeObject.id) : ""
Greg Holst
la source
Oui, quelque chose dans le sens de var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;et vérifiez si non false.
Hmerman6006
3

J'avais l'habitude de faire une if(maybeObject)vérification nulle dans mes javascripts.

if(maybeObject){
    alert("GOT HERE");
}

Donc, seulement si maybeObject- est un objet, l'alerte sera affichée. J'ai un exemple sur mon site.

https://sites.google.com/site/javaerrorsandsolutions/home/javascript-dynamic-checkboxes

user513365
la source
Le problème est que si peut- êtreObjet n'a pas été déclaré, il générera
Juanma Menendez
si maybeObjectc'est le cas 0, 0.0, or "", il vérifie faux
alejandrociatti
3

Je viens de tester les exemples de typeOf ci-dessus et aucun n'a fonctionné pour moi, donc j'ai plutôt utilisé ceci:

    btnAdd = document.getElementById("elementNotLoadedYet");
    if (btnAdd) {
       btnAdd.textContent = "Some text here";
    } else {
      alert("not detected!");
    }

Facundo Colombier
la source
1

En plus de vérifier l'existence de l'objet / de la variable, vous souhaiterez peut-être fournir une sortie "pire des cas" ou au moins la piéger dans une alerte afin qu'elle ne passe pas inaperçue.

Exemple de fonction qui vérifie, fournit une alternative et intercepte les erreurs.

function fillForm(obj) {
  try {
    var output;
    output = (typeof obj !== 'undefined') ? obj : '';
    return (output);
  } 
  catch (err) {
    // If an error was thrown, sent it as an alert
    // to help with debugging any problems
    alert(err.toString());
    // If the obj doesn't exist or it's empty 
    // I want to fill the form with ""
    return ('');
  } // catch End
} // fillForm End

J'ai créé cela aussi parce que l'objet que je lui passais pouvait être x, xm, xm [z] et typeof xm [z] échouerait avec une erreur si xm n'existait pas.

J'espère que ça aide. (BTW, je suis novice avec JS)

Frotter
la source
1

pour moi, cela a fonctionné pour un objet DOM:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}
and-bri
la source
1

Si vous ne vous souciez que de son existence (a-t-elle été déclarée?), La réponse approuvée suffit:

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

Si vous vous souciez qu'il ait une valeur réelle, vous devez ajouter:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}

Comme typeof( null ) == "object"

par exemple bar = { x: 1, y: 2, z: null}

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 

De cette façon vous vérifiez qu'il est ni nullou undefined, et depuis typeofne pas d' erreur si la valeur n'existe pas , plus &&courts circuits, vous ne serez jamais obtenir une erreur d' exécution.

Personnellement, je suggérerais d'ajouter un assistant fn quelque part (et ne faisons pas confiance typeof()):

function exists(data){
   data !== null && data !== undefined
}

if( exists( maybeObject ) ){
    alert("Got here!"); 
}
alejandrociatti
la source
0
if (n === Object(n)) {
   // code
}
Leo Lanese
la source
5
Bien que ce bloc de code puisse répondre à la question de l'OP, cette réponse serait beaucoup plus utile si vous expliquez en quoi ce code est différent du code de la question, ce que vous avez changé, pourquoi vous l'avez changé et pourquoi cela résout le problème sans en introduire d'autres.
Mifeet
-1
if (maybeObject !== undefined)
  alert("Got here!");
plunk2000
la source
-1

définissez la valeur de la zone de texte sur un cadre pour le cadre en ligne à l'aide du panneau à onglets div alignmnt. Donc, tout d'abord, avant de définir la valeur, nous devons vérifier que le cadre des panneaux à onglets sélectionné est disponible ou non en utilisant les codes suivants:

Code Javascript:

/////////////////////////////////////////
<script>

function set_TextID()
            {
                try
                    {
                        if(!parent.frames["entry"])
                            {
                            alert("Frame object not found");    
                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["entry"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["education"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["education"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["contact"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["contact"].document.getElementById("form_id").value=setText;
                            }

                        }catch(exception){}
                }

</script>
RAM
la source
-1

zéro et null sont des pointeurs implicites. Si vous ne faites pas d'arithmétique, ne comparez pas ou n'imprimez pas `` 0 '' à l'écran, il n'est pas nécessaire de le taper. C'est implicite. Comme implicite. Typeof n'est également pas requis pour la même raison. Regarder.

if (obj) console.log ("existe");

Je n'ai pas vu de demande de non ou bien car il n'est pas inclus en tant que. Autant j'aime le contenu supplémentaire qui ne rentre pas dans la question. Permet de rester simple.

ireadgud
la source
Je vois un pas dans la question: if (!maybeObject)- mais en effet, le titre demande le contraire.
Armali
-4

Je pense que c'est plus simple comme ça

if(myobject_or_myvar)
    alert('it exists');
else
   alert("what the hell you'll talking about");
noobtoo
la source
-10

Ou, vous pouvez tous commencer à utiliser ma méthode exclusive exclusive () à la place et pouvoir faire des choses considérées comme impossibles. c'est à dire:

Des choses comme:, exists("blabla")ou même: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")sont également possibles ...

Bill le lézard
la source
4
Et où est cette méthode?
v010dya