Überprüfen Sie, ob das Objekt in JavaScript vorhanden ist

313

Wie überprüfe ich die Existenz eines Objekts in JavaScript?

Folgendes funktioniert:

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

Dies wirft jedoch einen Fehler auf:

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

Der Fehler:

maybeObject ist nicht definiert.

Yarin
quelle

Antworten:

578

Sie können den typeofOperator sicher für undefinierte Variablen verwenden.

Wenn ihm ein Wert zugewiesen wurde, einschließlich null, gibt typeof etwas anderes als undefiniert zurück. typeof gibt immer einen String zurück.

Deshalb

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}
JAL
quelle
73
Wenn es immer eine Zeichenfolge ist, können (sollten) Sie dies wirklich !==für den Vergleich tun .
Micah
9
Da dies eine Kernfunktion von Javascript ist, ist es eine Schande, dass es keine bessere und weniger fehleranfällige Funktion gibt. Der Zeichenfolgenvergleich verhindert, dass der Compiler uns zu 100% zuverlässig mitteilt, wann wir bei diesen Überprüfungen einen kleinen Fehler (wie einen Tippfehler) gemacht haben.
Domi
In meinem Fall suche ich nach diesem Objekt, also hilft das nicht. Ich möchte eine Lösung, die ich auch in der Konsole verwenden kann, um zu sehen, ob sich das Objekt irgendwo ohne Klick in Domtree befindet.
Blamb
@TJCrowder Diese Beispiele scheinen nicht mehr zugänglich zu sein.
Stefan van den Akker
1
@StefanvandenAkker: Der Link zum schlechten Beispiel sollte jsbin.com/ibeho3/1 sein . Das gute Beispiel war in Ordnung: jsbin.com/ibeho3/2 . (Leider leitet JSBin auf den neuesten Stand um, und die Leute haben das bis auf einen Zentimeter seines Lebens bearbeitet.)
TJ Crowder
48

Da es hier viele Halbwahrheiten gibt, dachte ich, ich mache einige Dinge klarer.

Tatsächlich können Sie nicht genau sagen, ob eine Variable vorhanden ist (es sei denn, Sie möchten jede zweite Zeile in einen Try-Catch-Block einschließen).

Der Grund dafür ist, dass Javascript diesen berüchtigten Wert hat, undefinedwas auffallend nicht bedeutet, dass die Variable nicht definiert ist oder nicht existiertundefined !== not defined

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

Also sowohl eine Variable, die existiert, als auch eine andere, die Ihnen den undefined Typ nicht melden kann .

Was @ Kevins Missverständnis betrifft , null == undefined. Dies ist auf ===Typzwang zurückzuführen , und es ist der Hauptgrund, warum Crockford jedem, der sich über solche Dinge nicht sicher ist, immer wieder sagt, dass er immer einen strengen Gleichheitsoperator verwenden soll , um auf möglicherweise falsche Werte zu testen. null !== undefinedgibt Ihnen, was Sie erwarten könnten. Bitte beachten Sie auch, dass foo != nulldies eine effektive Möglichkeit sein kann, um zu überprüfen, ob eine Variable weder undefinednoch ist null. Natürlich können Sie explizit sein, da dies die Lesbarkeit verbessern kann.

Wenn Sie die Frage einschränken, um zu überprüfen, ob ein Objekt vorhanden ist, ist dies typeof o == "object"möglicherweise eine gute Idee, es sei denn, Sie berücksichtigen keine Arrays-Objekte, da dies auch als Typ gemeldet wird, der objectSie möglicherweise etwas verwirrt. Ganz zu schweigen davon, dass Sie typeof nullauch das bekommen, objectwas einfach falsch ist.

Der Ur - Bereich , wo man wirklich vorsichtig sein sollte , etwa typeof, undefined, null, unknownund andere misteries sind Host - Objekte. Man kann ihnen nicht vertrauen. Sie können fast alles tun, was sie wollen. Seien Sie also vorsichtig mit ihnen und prüfen Sie die Funktionalität, wenn Sie können, da dies die einzige sichere Möglichkeit ist, eine Funktion zu verwenden, die möglicherweise gar nicht existiert.

gblazex
quelle
5
foo!=nullWenn Sie dies foonicht tun, wird ein ReferenceError erstellt, wenn dieser nicht definiert ist. Daher ist es besser zu verwenden typeof, es sei denn, Sie planen, die Ausnahme abzufangen.
JAL
1
Ich schreibe es noch einmal für Sie auf: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . Ich habe nicht gesagt, dass != nulles gut ist, um zu überprüfen, ob es existiert. Sie nehmen es aus dem Zusammenhang. (Ich erwähnte auch, dass es eine Nebenbemerkung ist, die nicht eng mit dem Thema der OP-Frage zusammenhängt)
gblazex
2
Sie verwechseln erneut den nicht definierten Begriff mit dem Typ undefined. Sie sind nicht gleich. (note) it can be used !== you should use. Verwenden Sie beim Lesen den gesunden Menschenverstand. Wenn die Variable deklariert ist (Parameterliste oder anderswo) und Sie überprüfen möchten, ob sie einen Wert hat, ist !=null völlig sicher. Es ist ein anderer Anwendungsfall als das, was das OP verlangt hat, deshalb habe ich ihn als Notiz eingeführt. Der ganze Absatz handelt übrigens von @ Kevins Post und Typ Zwang. Wie Sie feststellen können, wenn Sie sorgfältig lesen.
Gblazex
@JAL Sie vermissen den Teil, mit dem Sie keinen Fehler riskieren, != nullwenn Sie wissen, dass die Variable deklariert wurde. Dies ist sehr nützlich, um Funktionsargumente zu überprüfen. var hasValue = function(foo) {return foo != null}
Beachten Sie
@ tybro0103 Das stimmt, aber das gesamte Problem lautet "Wie überprüfe ich die Existenz eines Objekts in JavaScript?". Wenn Sie sicher sind, dass es deklariert wurde, ist das eine andere Situation.
JAL
12

Sie können verwenden:

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

Zwei Wege.

typeof für lokale Variablen

Sie können mit typeof auf ein lokales Objekt testen:

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

Fenster für globale Variablen

Sie können ein globales Objekt (eines, das im globalen Bereich definiert ist) testen, indem Sie das Fensterobjekt untersuchen:

if (window.FormData) {}
überleuchtet
quelle
7

Wenn dies ein globales Objekt ist, können Sie es verwenden if (!window.maybeObject)

Nikita Rybak
quelle
Ich fand window.hasOwnProperty('maybeObject')es etwas lesbarer, wenn es ein globales Objekt ist
Nathaniel Rogers
5

Sie könnten "typeof" verwenden.

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

Der Thread wurde vor einiger Zeit geöffnet. Ich denke in der Zwischenzeit ist die Verwendung eines ternären Operators die einfachste Option:

maybeObject ? console.log(maybeObject.id) : ""
Greg Holst
quelle
Ja, etwas in der Art von var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;und prüfen Sie, ob nicht false.
Hmerman6006
3

Früher habe ich if(maybeObject)in meinen Javascripts nur eine Nullprüfung durchgeführt.

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

Nur wenn maybeObject- ein Objekt ist, wird die Warnung angezeigt. Ich habe ein Beispiel auf meiner Website.

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

user513365
quelle
Das Problem ist, wenn vielleichtObject nicht deklariert wurde, wird es den Fehler auslösen
Juanma Menendez
wenn maybeObjectist 0, 0.0, or "", es prüft auf false
alejandrociatti
3

Ich habe gerade die typeOf-Beispiele von oben getestet und keines hat für mich funktioniert. Stattdessen habe ich Folgendes verwendet:

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

Facundo Colombier
quelle
1

Abgesehen von der Überprüfung der Existenz des Objekts / der Variablen möchten Sie möglicherweise eine "Worst-Case" -Ausgabe bereitstellen oder sie zumindest in einer Warnung einfangen, damit sie nicht unbemerkt bleibt.

Beispiel für eine Funktion, die Fehler überprüft, Alternativen bereitstellt und abfängt.

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

Ich habe dies auch erstellt, weil das Objekt, an das ich es übergeben habe, x, xm, xm [z] sein kann und der Typ xm [z] mit einem Fehler fehlschlagen würde, wenn xm nicht vorhanden wäre.

Ich hoffe, es hilft. (Übrigens bin ich Anfänger bei JS)

Reiben
quelle
1

Für mich funktionierte das für ein DOM-Objekt:

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

Wenn Sie sich nur um seine Existenz kümmern (wurde es deklariert?), Reicht die genehmigte Antwort aus:

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

Wenn es Ihnen wichtig ist, dass es einen tatsächlichen Wert hat, sollten Sie Folgendes hinzufügen:

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

Wie typeof( null ) == "object"

z.B bar = { x: 1, y: 2, z: null}

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

Auf diese Weise überprüfen Sie, ob es weder nullnoch ist undefined, und da typeofkein Fehler auftritt, wenn kein Wert vorhanden ist, plus &&Kurzschlüsse, erhalten Sie niemals einen Laufzeitfehler.

Persönlich würde ich vorschlagen, irgendwo einen Helfer fn hinzuzufügen (und lasst uns nicht vertrauen typeof()):

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

if( exists( maybeObject ) ){
    alert("Got here!"); 
}
Alejandrociatti
quelle
0
if (n === Object(n)) {
   // code
}
Leo Lanese
quelle
5
Während dieser Codeblock möglicherweise die Frage des OP beantwortet, wäre diese Antwort viel nützlicher, wenn Sie erklären, wie sich dieser Code vom Code in der Frage unterscheidet, was Sie geändert haben, warum Sie ihn geändert haben und warum dies das Problem löst ohne andere vorzustellen.
Mifeet
-1
if (maybeObject !== undefined)
  alert("Got here!");
plunk2000
quelle
-1

Setzen Sie den Textfeldwert mithilfe des Registerkartenfelds div alignmnt auf einen Frame in einen Inline-Frame. Bevor Sie den Wert festlegen, müssen Sie zunächst überprüfen, ob ausgewählte Rahmen mit Registerkarten verfügbar sind oder nicht, indem Sie die folgenden Codes verwenden:

Javascript Code:

/////////////////////////////////////////
<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
quelle
-1

Null und Null sind implizite Zeiger. Wenn Sie nicht rechnen, vergleichen oder '0' auf dem Bildschirm drucken, müssen Sie es nicht tatsächlich eingeben. Es ist implizit. Wie angedeutet. Aus dem gleichen Grund ist auch Typeof nicht erforderlich. Beobachten.

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

Ich habe keine Anfrage für ein Nicht gesehen oder sonst ist es nicht enthalten als. So sehr ich zusätzliche Inhalte liebe, die nicht in die Frage passen. Lass es uns einfach halten.

ireadgud
quelle
Ich sehe ein nicht in der Frage: if (!maybeObject)- aber tatsächlich fragt der Titel nach dem Gegenteil.
Armali
-4

Ich denke, es ist so einfach

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

Oder Sie können stattdessen alle meine exklusive Methode existest () verwenden und in der Lage sein, Dinge zu tun, die als unmöglich angesehen werden. dh:

Dinge wie: exists("blabla")oder sogar: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")sind auch möglich ...

Bill die Eidechse
quelle
4
Und wo ist diese Methode?
v010dya