JavaScript'te tanımlı olmayan bir değişken nasıl kontrol edilir


913

Değişkenin tanımlanıp tanımlanmadığını kontrol etmek istedim. Örneğin, aşağıdakiler tanımlı olmayan bir hata atar

alert( x );

Bu hatayı nasıl yakalayabilirim?



5
Bunun bir büyükbaba olduğu anlaşılıyor: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… - büyük gramps şu olabilir: stackoverflow.com/questions/27509/…
rastgele

1
Bu, işaretli yinelemenin kopyası değildir. Değişken çözünürlük ve nesne özellik çözünürlüğü çok farklı şeylerdir. Daha iyi bir kopya, bir değişkenin javascript'te olup olmadığını nasıl kontrol edersiniz? .
RobG

Hatanız değişkenin bildirilmemesinden kaynaklanıyor. Cevapların çoğu ödeve odaklanmıştır. Daha fazla bilgi için cevabımı görün . Ayrıca bunların çoğu hatalı olarak null ve undefined öğelerinin JavaScript'teki nesneler olduğunu belirtir. Bunlar ilkel , nesneler değil ...
JBallin

Yanıtlar:


1690

JavaScript'te nullbir nesnedir. Var olmayan şeyler için başka bir değer daha var undefined. DOM null, belgedeki bir yapıyı bulamadığı neredeyse tüm durumlar için döner , ancak JavaScript'in kendisinde undefinedkullanılan değerdir.

İkincisi, hayır, doğrudan bir eşdeğeri yoktur. Gerçekten özel olarak kontrol etmek istiyorsanız, şunları yapın null:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Eğer bir değişken olup olmadığını kontrol etmek istiyorsanız, bu sadece ile yapılabilir try/ catchberi typeofbildirilmemiş bir değişkeni tedavi etmek ve değişken değeriyle beyan edecektir undefinedeşdeğer olarak.

Ama, bir değişken deklare olup olmadığını kontrol etmek ve değildir undefined:

if (yourvar !== undefined) // Any scope

Önceden, typeoftanımsız olarak güvenli bir şekilde kontrol etmek için operatörün kullanılması gerekiyordu , çünkü undefinedtıpkı bir değişken gibi yeniden atanabiliyordu . Eski yol şöyle görünüyordu:

if (typeof yourvar !== 'undefined') // Any scope

undefinedYeniden atanabilir olma sorunu, 2009 yılında piyasaya sürülen ECMAScript 5'de düzeltildi. Artık bir süredir salt okunur olarak kullanmadan güvenle kullanabilir ===ve !==test undefinededebilirsiniz .typeofundefined

Bir üyenin bağımsız olup olmadığını bilmek, ancak değerinin ne olduğunu umursamak istemiyorsanız:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Eğer bir değişken olup olmadığını bilmek istiyorsanız truthy :

if (yourvar)

Kaynak


71
undefined ayrılmış bir sözcük değil; siz (veya başka birinin kodu) "undefined = 3" yapabilirsiniz ve bu da testlerinizin ikisini kırar.
Jason S

6
"Değişkenin var olduğunu biliyor ama içinde herhangi bir değer olup olmadığını bilmiyorum" - ha ?!
Jason S

36
Bence atanmamış bir değişkene atıfta bulunuyor. örneğin: var foo; // foo var ama bir değeri yok
Wally Lawless

3
Hmmm ... Sadece "kaynak" bağlantısını fark ettim: bu yazının tamamı bir posta listesinden doğrudan bir alıntıdır ve orijinal yazarın açıklığa kavuşturulamayacağı için muhtemelen daha açık hale getirmek için düzenlenmelidir.
Jason S

11
"JavaScript null bir nesnedir.", Bu aslında doğru değildir ve muhtemelen, bu yanlış anlaşılmanın suçlusu typeofoperatördür ( typeof null == 'object'). nullDeğeri a, temel değer sadece bir değerdir, boş türü .
CMS

347

Bir değişkenin gerçekte olup olmadığını test etmenin tek yolu undefinedaşağıdakileri yapmaktır. Undefined öğesinin JavaScript'teki bir nesne olduğunu unutmayın.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Bu iş parçacığındaki diğer çözümlerden bazıları, bir değişkenin tanımlanmış olmasına rağmen tanımlanmamış olduğuna inanmanıza neden olur (örneğin, NULL veya 0 değeriyle).


18
Soru burada tanımlanmadı çünkü burada bir tür olmalıdırVar! == 'tanımsız', değil mi?
eomeroff

1
Gerçekten, undefinded'in bir nesne olduğunu düşünmüyorum, önce belgeleri kontrol edin developer.mozilla.org/tr-TR/docs/Web/JavaScript/Data_structures
Nicramus

2
Üretmeyen tek test ReferenceError.
Nostalg.io

2
Bu kod doğrudur, ancak undefinedjavascript bir nesne olduğunu söyleyerek yanlış bilgi olduğunu düşünüyorum . Bu ifade zaten cevabınızla ilgili mi? Adlı genel tanımlayıcıya atanan bir undefinedtür değeridir . undefinedundefined
SimplGy

1
Bu tek yol olması açısından artık yanlış. undefinedES5'ten beri salt okunur. Güvenle kullanılarak tanımlanmamış için test edebilirsiniz if (x === undefined) {...}veya böyle kısaltmalar kullanarak: if (x === void 0).
Stephen M Irving

66

Teknik olarak, uygun çözüm (inanıyorum):

typeof x === "undefined"

Bazen tembelleşebilir ve kullanabilirsiniz

x == null

ancak bu, hem tanımsız bir değişkenin x hem de null içeren bir değişkenin true değerini döndürmesini sağlar.


1
Eğer yazarsanız var x;ve sonra typeof x;yaptığınız "undefined"gibi alacaksınıztypeof lakjdflkdsjflsj;
Muhammed Umer

Yani tanımlanmamış fakat beyan edilmiş değişkeni kontrol etmenin bir yolu yok mu?
Muhammed Umer

1
Ben öyle düşünmüyorum; Neden isteyeceğinden emin değilim.
Jason S

ujndefined apices arasında olmamalıdır
LowFieldTheory

apices ile ne demek istiyorsun?
Jason S

19

Daha kolay ve daha kısa bir versiyon:

if (!x) {
   //Undefined
}

VEYA

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
x bir işlev çağrısından ayarlanırsa ilk kod parçası yanlış olabilir. x = A () gibi; A bir şey döndürmezse, varsayılan olarak "tanımsız" değerini döndürür. ! X yapmak mantıklı olarak doğru olacaktır. Ancak, A () 0 döndürürse! X, x = 0 olarak false olmalıdır. Ancak JS'de! 0 da doğrudur.
Rajat

ikinci kod kısaltılabilir: if (! typeof (XX)) {...} else {...}
Alejandro Silva

2
@AlejandroSilva Geç cevap verdiğim için üzgünüm. Typeof bir dize döndürdüğünden bu çalışmaz, bu nedenle tanımsız bir değişken için 'undefined' döndürür.
Dmitri Farkov

5
Lütfen ilk pasajdan kurtulun, sadece kötü
Juan Mendes

1
Diğer yorumlar, ilk örneğin kötü olduğunu, ancak nedenini açıkça belirtmediğini belirtti. Yani, yeni kodlayıcılar için:! X, x'in tanımlanıp tanımlanmadığını değil, bunun doğru olup olmadığını test eder. Dizeler, boolean true ve pozitif sayıların hepsi doğrudur (ve bazı şeyleri unutuyor olabilirim), ancak 0, boolean false ve boş bir dize gibi diğer potansiyel olarak geçerli değerler doğru değildir. İlk örnek, belirli kullanım durumları için çalışabilir (örneğin, boş olarak tanımlanamayanla aynı şekilde işleyebiliyorsanız, bir dizeyi test etmek), ancak işe yaramadığı birçok yer nedeniyle, varsayılan kontrol yolu olarak düşünülmemelidir.
cfc

16

Sık sık yaptım:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
"==" ifadesini "===" olarak değiştirmeyi düşünün. DoSomething (null) öğesini çağırırsanız, uyarıyı da alırsınız. Eğer istediğin bu olmadığı sürece.
Jason S

Evet. Eşdeğer veya tam olarak eşit olup olmadığına karar vermelisiniz. Her iki durumda da bir fayda olabilir.
Joe

1
sadece şöyle kontrol edin-> if (typeof variableName! == 'undefined') {alert (variableName);}
Muhammad Sadiq

zaten işe yaramaz bir fonksiyona tanımlanamayacağınız için bu işe yaramaz
avalanche1

2
Tabi ki yapabilirsin. Bağımsız değişken olmayan bir işlevi çağırmayı deneyin.
Joe

3

Üçlü koşullu işleci de kullanabilirsiniz:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


Ya eğer var a = false;? Bunun a===undefinedyerine kontrol etmelisiniz
Iter Ator

1
Soru: tanımlanmamış bir değişkeni kontrol edin ..... Bu tanımsız değişkendir: var x; yukarıdakiler hata verir
Muhammad Umer

"A = false ise, o zaman" i bilmiyorum 'a' "" - Sorun bu, soru doğru olup olmadığını test etmektir. A, false olarak tanımlanırsa, a tanımsız değildir. Bu durumda yanlış sonuç döndürülür. Bu yaklaşımın neden işe yaramadığı hakkında daha fazla bilgi için stackoverflow.com/a/858270/2055492 adresindeki yorumuma bakın .
cfc

kalmayacak !agerçek için test undefined, aynı zamanda için de geçerlidir test eder 0ve nullve false. Bu çok yanlış ve kaldırılması gerekiyor.
Stephen M Irving

2

Sıklıkla en basit yolu kullanırım:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

DÜZENLE:

Değişkeni başlatmadan, "Yakalanmayan ReferenceError: değişken tanımlanmamış ..." için istisna atılır.


2
Uncaught ReferenceError: variable is not defined
Muhammed Umer

@MuhammadUmer, yanlış! variableile tanımlanır var variable;. Ve bu snippet variableyerel kapsamda geçersiz kılınır . Bir kapatma veya genel değişkene erişmeyi bekleyen mantığı kırabilir. Yani:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев

2

Başka bir potansiyel "çözüm", windownesneyi kullanmaktır . Bir tarayıcıdayken referans hata sorununu önler.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

Bu orijinal soruyu hiç çözmez ve tamamen ilgisizdir. Poster, bir şeyin doğru mu yoksa falsey olup olmadığını nasıl test edeceğini sormuyordu, nasıl test edileceğini sordu undefined. Bu böyle olmayacak.
Stephen M Irving

2

Hata size bunun xolmadığını bile söylüyor ! Bir değer atanmaktan farklı olan beyan edilmemiştir .

var x; // declaration
x = 2; // assignment

Bildirirseniz x, bir hata almazsınız. Sen şeklinde bir uyarı alacağı undefinedçünkü xmevcut / ilan edilmiştir ancak bir değer atanmış edilmemiştir.

Değişkenin bildirilip bildirilmediğini typeofkontrol etmek için, bir değişkenin var olup olmadığını kontrol etmenin diğer herhangi bir yöntemini başlangıçta aldığınız aynı hatayı yükseltir.

if(typeof x  !==  "undefined") {
    alert(x);
}

Bu, saklanan değerin türünü kontrol ediyor x. Sadece dönecektir undefinedzaman xo takdirde beyan edilmiş VEYA gelmiştir ilan edilmiş ve henüz belirlenmedi.


undefined, ES5'ten (2009 sürümü) beri salt okunurdur ve artık typeofoperatöre ihtiyacınız yoktur .
Stephen M Irving

2

voidOperatör döner undefinedbir bağımsız değişken / ekspresyon için geçirilen. Sonucun karşı test edebilirsiniz böylece (aslında bazı minifiers kodunuzu değiştirmek undefinediçin void 0birkaç karakter kaydetmek için)

Örneğin:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

Ding Ding! Bu doğru cevap. Utanç en altta. Herkes hala kullanmaya devam ediyor typeofve düşünme undefinedyeniden atanabiliyor, ki bu yaklaşık on yıldır mümkün değil.
Stephen M Irving

Bu aynı zamanda ES5'ten önce de güvende idi, çünkü o zamanlar yeniden atamış olsanız bile undefined, Tanrı yalnızca hangi nedenin kullanıldığını bilir, kullanmak ne olursa olsun void 0geri döner undefined.
Stephen M Irving

1

Biz kontrol edebilirsiniz undefinedşöyle

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

Sadece aşağıdaki gibi bir şey yapın:

function isNotDefined(value) {
  return typeof value === "undefined";
}

ve şöyle deyin:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

Kabul edilen cevap doğrudur. Sadece bir seçenek daha eklemek istedim. try ... catchBu durumu işlemek için bloğu da kullanabilirsiniz . Çılgınca bir örnek:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

catchBlok düzeyinde bir kapsam oluşturduğundan, biraz dağınık olan bloğun farkında olun . Ve elbette, örnek, sorulan soruya cevap vermek için son derece basitleştirilmiştir, hata işlemede en iyi uygulamaları kapsamaz;).


0

Ben gerçekten benim javascript dosyaları dağınıklık miktarını keser bir değişken bildirildi doğrulamak için küçük bir işlev kullanın. Değişkenin yalnızca var olduğundan değil, aynı zamanda bir değer atandığından emin olmak için değer için bir denetim eklerim. İkinci koşul, değişkenin örneklenip oluşturulmadığını kontrol eder, çünkü değişken tanımlanmış ancak örneklenmemişse (aşağıdaki örneğe bakın), kodunuzdaki değerine başvurmaya çalışırsanız yine de bir hata atar.

Örneklenmemiş - var my_variable;Örneklenmiş -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Daha sonra, değişkenin hem tanımlandığını hem de bu şekilde başlatıldığını test etmek için koşullu bir ifade kullanabilirsiniz ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

ya da bunun tanımlanmadığını ve anında kullanılmadığını test etmek için ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
Neden yüklemini hemen geri vermiyorsun? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
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.