Sprawdź, czy obiekt istnieje w JavaScript


313

Jak zweryfikować istnienie obiektu w JavaScript?

Następujące prace:

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

Ale to powoduje błąd:

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

Błąd:

maybeObject nie jest zdefiniowany.

Odpowiedzi:


578

Możesz bezpiecznie używać typeofoperatora na niezdefiniowanych zmiennych.

Jeśli została mu przypisana jakakolwiek wartość, w tym null, typeof zwróci coś innego niż niezdefiniowany. typeof zawsze zwraca ciąg.

W związku z tym

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

73
jeśli to zawsze ciąg znaków, naprawdę możesz (powinieneś) zrobić to !==dla porównania.
Micheasza

9
Ponieważ jest to podstawowa funkcja Javascript, szkoda, że ​​nie ma lepszego i mniej podatnego na błędy wbudowanego. Porównanie ciągów uniemożliwia kompilatorowi w 100% rzetelną informację, kiedy popełniamy niewielki błąd (jak literówka) w tego rodzaju kontrolach.
Domi

w moim przypadku szukam SZUKAJ tego obiektu, więc to nie pomaga. szukam rozwiązania, którego mogę użyć w konsoli jako wel, aby sprawdzić, czy obiekt jest gdzieś w domtree bez żadnych kliknięć ..
blamb

@TJCrowder Te przykłady nie są już dostępne.
Stefan van den Akker

1
@StefanvandenAkker: Link do złego przykładu powinien brzmieć jsbin.com/ibeho3/1 . Dobry przykład był w porządku: jsbin.com/ibeho3/2 . (Niestety JSBin przekierowuje do najnowszego, a ludzie edytowali to w ciągu jednego cala swojego życia.)
TJ Crowder

48

Jest tu wiele półprawd, więc pomyślałem, że wyjaśnię kilka rzeczy.

W rzeczywistości nie można dokładnie stwierdzić, czy zmienna istnieje (chyba że chcesz zawinąć co drugą linię w blok try-catch).

Powodem jest to, że JavaScript ma tę notoryczną wartość, undefinedktóra uderzająco nie oznacza, że ​​zmienna nie jest zdefiniowana lub że nie istniejeundefined !== not defined

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

Tak więc zarówno zmienna, która istnieje, jak i inna, która nie może zgłosić ci undefined typu.

Co do @ nieporozumieniem Kevina, null == undefined. Wynika to z przymusu typu i jest to główny powód, dla którego Crockford mówi każdemu, kto nie jest pewien tego rodzaju rzeczy, aby zawsze używał operatora ścisłej równości ===do testowania możliwych wartości fałszywych. null !== undefineddaje ci to, czego możesz się spodziewać. Pamiętaj również, że foo != nullmoże to być skuteczny sposób sprawdzenia, czy zmienna nie jest ani undefinedani null. Oczywiście możesz być wyraźny, ponieważ może to poprawić czytelność.

Jeśli ograniczysz pytanie, aby sprawdzić, czy obiekt istnieje, typeof o == "object"może być dobrym pomysłem, z wyjątkiem sytuacji, gdy nie bierzesz pod uwagę obiektów tablic, ponieważ będzie to również zgłaszać, że objectmoże to być nieco mylące. Nie wspominając o tym typeof null, że da ci objectto, co jest po prostu złe.

Pierwotna powierzchnia gdzie naprawdę należy być ostrożnym typeof, undefined, null, unknowni inne misteries są obiektami gospodarza. Nie można im ufać. Mogą robić prawie każdą brudną rzecz, jaką chcą. Zachowaj więc ostrożność, jeśli to możliwe, sprawdź funkcjonalność, ponieważ jest to jedyny bezpieczny sposób korzystania z funkcji, która może nawet nie istnieć.


5
Po prostu zrobienie foo!=nullwygeneruje błąd ReferenceError, jeśli foonie jest zdefiniowany. Dlatego lepiej jest używać typeof, chyba że planujesz złapać wyjątek.
JAL

1
Zapisuję to dla ciebie ponownie: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . Nie powiedziałem, że != nulljest dobry do sprawdzania, czy istnieje. Zabierasz to z kontekstu. (Wspomniałem również, że jest to sidenotka, niezwiązana ściśle z tematem pytania PO)
gblazex

2
Znowu mylisz niezdefiniowany termin z typem undefined. One nie są takie same. (note) it can be used !== you should use. Podczas czytania należy kierować się zdrowym rozsądkiem. Kiedy zmienna jest zadeklarowana (lista parametrów lub gdzie indziej) i chcesz sprawdzić, czy ma wartość, wartość !=null jest całkowicie bezpieczna. Jest to inny przypadek użycia niż ten, o który prosił PO, dlatego wtrąciłem go jako notatkę. Cały akapit dotyczy postu @ Kevin i typu przymusu btw. Jak możesz zauważyć, jeśli czytasz uważnie.
gblazex

@JAL brakuje Ci części, której nie ryzykujesz błędem, != nullgdy wiesz, że zmienna została zadeklarowana. Jest to bardzo przydatne do sprawdzania argumentów funkcji, należy wziąć pod uwagę:var hasValue = function(foo) {return foo != null}
tybro0103 10.09.13

@ tybro0103 to prawda, ale cały problem brzmi: „Jak mogę zweryfikować istnienie obiektu w JavaScript?”. Jeśli jesteś pewien, że zostało zadeklarowane, to inna sytuacja.
JAL

12

Możesz użyć:

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

8

Dwie drogi.

typeof dla zmiennych lokalnych

Możesz przetestować obiekt lokalny, używając typeof:

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

okno dla zmiennych globalnych

Możesz przetestować obiekt globalny (zdefiniowany w zasięgu globalnym), sprawdzając obiekt okna:

if (window.FormData) {}

7

Jeśli jest to obiekt globalny, możesz użyć if (!window.maybeObject)


Odkryłem, że window.hasOwnProperty('maybeObject')jest trochę bardziej czytelny, jeśli jest to obiekt globalny
Nathaniel Rogers


4

Wątek został otwarty jakiś czas temu. Myślę, że tymczasem użycie operatora trójskładnikowego jest najprostszą opcją:

maybeObject ? console.log(maybeObject.id) : ""

Tak, coś w stylu var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;i sprawdź, jeśli nie false.
Hmerman6006

3

Kiedyś po prostu if(maybeObject)sprawdzałem jako zerowy w moich skryptach javascript.

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

Tak więc tylko jeśli maybeObject- jest obiektem, alert zostanie wyświetlony. Mam przykład w mojej witrynie.

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


Problem polega na tym, że jeśli obiekt nie został zadeklarowany, wygeneruje
Juanma Menendez

jeśli maybeObjectjest 0, 0.0, or "", sprawdza fałsz
alejandrociatti

3

Właśnie przetestowałem przykłady typeOf z góry i żaden nie działał dla mnie, więc zamiast tego użyłem tego:

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


1

Oprócz sprawdzania istnienia obiektu / zmiennej, możesz chcieć dostarczyć wyjście „najgorszego przypadku” lub przynajmniej uwięzić go w alercie, aby nie został niezauważony.

Przykład funkcji sprawdzającej, zapewniającej alternatywę i wychwytującej błędy.

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

Stworzyłem to również dlatego, że obiekt, który do niego przekazałem, może być x, xm, xm [z] i typof xm [z] nie powiedzie się z błędem, jeśli xm nie istnieje.

Mam nadzieję, że to pomoże. (BTW, jestem nowicjuszem w JS)


1

dla mnie działało to dla obiektu DOM:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}

1

Jeśli zależy ci tylko na jego istnieniu (czy zostało zadeklarowane?), Wystarczy zatwierdzona odpowiedź:

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

Jeśli zależy ci na tym, aby miała rzeczywistą wartość, dodaj:

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

Tak jak typeof( null ) == "object"

na przykład bar = { x: 1, y: 2, z: null}

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

W ten sposób można sprawdzić, czy jest to ani nullczy undefined, a ponieważ typeofnie ma błędu, jeśli wartość nie istnieje oraz &&zwarć, nigdy nie pojawia się błąd w czasie wykonywania.

Osobiście sugerowałbym dodanie gdzieś pomocnika fn (i nie ufajmy typeof()):

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

if( exists( maybeObject ) ){
    alert("Got here!"); 
}

0
if (n === Object(n)) {
   // code
}

5
Chociaż ten blok kodu może odpowiedzieć na pytanie PO, odpowiedź ta byłaby znacznie bardziej przydatna, jeśli wyjaśnisz, czym ten kod różni się od kodu w pytaniu, co zmieniłeś, dlaczego go zmieniłeś i dlaczego to rozwiązuje problem bez przedstawiania innych.
Mifeet,


-1

ustaw wartość pola tekstowego na jedną ramkę na ramkę wbudowaną za pomocą panelu z kartami div alignmnt. Przede wszystkim więc, zanim ustawimy wartość, musimy sprawdzić, czy wybrana ramka z panelami z kartami jest dostępna lub nie używa następujących kodów:

Kod 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>

-1

zero i zero są niejawnymi wskaźnikami. Jeśli nie używasz arytmetyki, porównywania ani drukowania „0” na ekranie, nie musisz go wpisywać. To jest dorozumiane. Jak sugerowano. Typeof nie jest również wymagany z tego samego powodu. Zegarek.

if (obj) console.log („istnieje”);

Nie widziałem prośby o nie, bo inaczej nie jest to uwzględnione jako. Uwielbiam dodatkowe treści, które nie pasują do pytania. Niech to będzie proste.


Widzę , A NIE w pytaniu: if (!maybeObject)- ale rzeczywiście, tytuł prosi o przeciwnej.
Armali

-4

Pomyśl, że tak jest najłatwiej

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

-10

Albo wszyscy możecie zacząć korzystać z mojej wyłącznej metody exist () i móc robić rzeczy uważane za niemożliwe. to znaczy:

Rzeczy takie jak: exists("blabla")a nawet: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")są również możliwe ...


4
A gdzie jest ta metoda?
v010dya
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.