JavaScript'te nesnenin var olup olmadığını kontrol edin


313

JavaScript'te bir nesnenin varlığını nasıl doğrularım?

Aşağıdaki işler:

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

Ancak bu bir Hata verir:

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

Hata:

maybeObject Tanımlanmadı.

Yanıtlar:


578

typeofTanımsız değişkenlerde operatörü güvenle kullanabilirsiniz .

Null dahil herhangi bir değer atandıysa, typeof tanımsız dışında bir değer döndürür. typeof her zaman bir dize döndürür.

bu nedenle

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

73
her zaman bir dize ise, !==karşılaştırma için gerçekten yapabilirdi (gerekir) .
Micah

9
Bu temel bir Javascript özelliği olduğundan, daha iyi ve daha az hataya eğilimli bir yerleşik olmaması utanç vericidir. Dize karşılaştırması, bu tür denetimlerde küçük bir hata yaptığımızda (yazım hatası gibi) derleyicinin% 100 güvenilir bir şekilde bize söylemesini önler.
Domi

benim durumumda, bu nesne için ARAMA arıyorum, bu yüzden bu yardımcı olmaz. ben herhangi bir tıkırtı olmadan herhangi bir yerde domtree olup olmadığını görmek için wel olarak konsolda kullanabileceğiniz bir çözüm istiyorum ..
suçlamak

@TJCrowder Bu örneklere artık erişilemez gibi görünüyor.
Stefan van den Akker

1
@ StefantevandenAkker: Kötü örnekle bağlantı jsbin.com/ibeho3/1 olmalıdır . İyi örnek iyiydi: jsbin.com/ibeho3/2 . (Ne yazık ki JSBin en son yönlendiriyor ve insanlar bunu hayatının bir inç içinde düzenliyor.)
TJ Crowder

48

Burada çok fazla yarı-gerçek var, bu yüzden bazı şeyleri daha açık hale getirdiğimi düşündüm.

Aslında bir değişkenin var olup olmadığını doğru bir şekilde söyleyemezsiniz (her ikinci satırı bir try-catch bloğuna sarmak istemiyorsanız).

Bunun nedeni Javascript'in bu kötü şöhretli değere sahip undefinedolması, çarpıcı bir şekilde değişkenin tanımlanmadığı veya var olmadığı anlamına gelmezundefined !== not defined

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

Yani hem var olan bir değişken hem de olmayan başka bir değişken undefined türü bildirebilir .

@ Kevin'in yanlış algısına gelince, null == undefined ,. Bu, tip zorlamasından kaynaklanmaktadır ve Crockford'un bu tür şeylerden emin olmayan herkese her zaman ===olası eşitlik değerlerini test etmek için sıkı eşitlik operatörü kullanmasını söylemesinin ana nedeni budur . null !== undefinedsize ne beklediğinizi verir. O da not edin foo != nulldeğişken ne olup olmadığını kontrol etmek için etkili bir yol olabilir undefinedne de null. Tabii ki açık olabilirsiniz, çünkü okunabilirliğe yardımcı olabilir.

Soruyu bir nesnenin var olup olmadığını kontrol etmek için kısıtlarsanız, typeof o == "object" dizilerin nesnelerini dikkate almamanız dışında iyi bir fikir olabilir, çünkü bu da objectsizi biraz karışık bırakabilir. Sadece yanlış olanı typeof nullsize vereceğinden bahsetmiyorum bile object.

Gerçekten konusunda dikkatli olmalıdır ilkel alan typeof, undefined, null, unknowndiğer Misteries ve ana nesnelerdir. Onlara güvenilemez. İstedikleri neredeyse tüm kirli şeyleri yapmakta özgürdürler. Bu yüzden onlara dikkat edin, mümkünse işlevselliği kontrol edin, çünkü var olmayan bir özelliği kullanmanın tek güvenli yolu budur.


5
Tanımlı foo!=nulldeğilse basitçe yapmak ReferenceError üretir foo. Bu nedenle, typeofistisnayı yakalamayı planlamıyorsanız kullanmak daha iyidir .
JAL

1
Senin için tekrar yazıyorum: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . != nullVar olup olmadığını kontrol etmek için iyi demedim . Bağlamdan çıkarıyorsunuz. (Ben de bunun bir sidenote olduğunu, kesinlikle OP sorusunun konusuyla ilgili olmadığını belirtti)
gblazex

2
Tekrar tanımlanmayan terimi türle karıştırıyorsunuz undefined. Aynı değiller. (note) it can be used !== you should use. Okurken sağduyunuzu kullanın. Değişken bildirildiğinde (parametre listesi veya başka bir yerde) ve bir değerinin olup olmadığını kontrol etmek istediğinizde, !=null değeri tamamen güvenlidir. OP'nin istediğinden farklı bir kullanım alanı, bu yüzden onu not olarak davet ettim. Bütün paragraf @ Kevin'in gönderi ve tip zorlama btw hakkında. Dikkatlice okuduğunuzda fark edebileceğiniz gibi.
16:10

@JAL , değişkenin bildirildiğini bildiğinizde hata riski almadığınız kısmı kaçırıyorsunuz != null. Bu, işlev bağımsız değişkenlerini denetlemek için çok yararlıdır, var hasValue = function(foo) {return foo != null}
şunları

@ tybro0103 bu doğru, ancak tüm sorun "JavaScript'te bir nesnenin varlığını nasıl doğrularım?". Bildirildiğinden eminseniz, bu farklı bir durumdur.
JAL

12

Kullanabilirsiniz:

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

8

İki yol.

yerel değişkenler için typeof

Typeof kullanarak yerel bir nesneyi test edebilirsiniz:

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

global değişkenler için pencere

Pencere nesnesini inceleyerek genel bir nesneyi (genel kapsamda tanımlanan) test edebilirsiniz:

if (window.FormData) {}


5

"Typeof" kullanabilirsiniz.

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

4

Konu bir süre önce açıldı. Bu arada üçlü bir operatörün en basit seçenek olduğunu düşünüyorum:

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

Evet, çizgileri boyunca bir şey var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;ve olmadığını kontrol edin false.
Hmerman6006


3

Ben sadece yukarıdaki typeOf test ettik ve hiçbiri benim için çalıştı, bu yüzden bunun yerine kullandım:

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


1

Nesnenin / değişkenin varlığını kontrol etmenin yanı sıra, "en kötü durum" çıktısı sağlamak veya en azından fark edilmeyecek şekilde bir uyarıya sıkıştırmak isteyebilirsiniz.

Kontrol eden, alternatif sağlayan ve hataları yakalayan işlev örneği.

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

Bunu ben de oluşturduğum nesne x, xm, xm [z] ve xm [z] tipeof olabilir eğer xm mevcut değilse bir hata ile başarısız olur.

Umut ediyorum bu yardım eder. (BTW, JS konusunda acemi oldum)


1

benim için bu bir DOM nesnesi için çalıştı:

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

1

Yalnızca varlığını önemsiyorsanız (beyan edildi mi?), Onaylanmış cevap yeterlidir:

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

Gerçek bir değere sahip olmasını önemsiyorsanız şunları eklemelisiniz:

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

Gibi typeof( null ) == "object"

Örneğin bar = { x: 1, y: 2, z: null}

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

Bu yolu ikisi de değil kontrol nullveya undefined, ve o zamandan beri typeofdeğeri mevcut artı yoksa hata yapmaz &&kısa devreler, bir çalışma zamanı hatası alıyorum asla.

Şahsen, bir yere bir yardımcı fn eklemenizi öneririm (ve güvenmeyelim typeof()):

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

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

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

5
Bu kod bloğu OP'nin sorusunu yanıtlasa da, bu kodun sorudaki koddan nasıl farklı olduğunu, neyi değiştirdiğinizi, neden değiştirdiğinizi ve bunun neden sorunu çözdüğünü açıklarsanız bu cevap çok daha yararlı olacaktır. başkalarını tanıtmadan.
Mifeet


-1

div alignmnt sekmeli panelini kullanarak Textbox değerini bir çerçeveye satır içi çerçeveye ayarlayın. Her şeyden önce, değeri ayarlamadan önce, aşağıdaki kodları kullanarak seçili sekmeli panel çerçevesini kontrol etmeliyiz:

Javascript Kodu:

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

sıfır ve null, örtük işaretçilerdir. Ekranda aritmetik, karşılaştırma veya '0' yazmıyorsanız, bunu gerçekten yazmanıza gerek yoktur. Örtük. Zımni olduğu gibi. Aynı nedenden ötürü typeof da gerekli değildir. İzlemek.

(obj) console.log ("varsa");

Ben bir istek için ya da başka orada görmedim olarak dahil değildir. Soruya uymayan ekstra içeriği sevdiğim kadar. Basit tutalım.


Sorunda bir not görmüyorum : if (!maybeObject)- ama gerçekten, başlık tam tersini istiyor.
Armali

-4

Bunun en kolay olduğunu düşünün

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

-10

Ya da, bunun yerine benim özel exist () yöntemimi kullanmaya başlayabilir ve imkansız olduğu düşünülen şeyleri yapabilirsiniz. yani:

Gibi şeyler:, exists("blabla")hatta: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")mümkün de ...


4
Peki bu yöntem nerede?
v010dya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.