Soru Değişkenin 'undefined' veya 'null' olup olmadığını nasıl belirleyebilirim?


Değişken olup olmadığını nasıl belirlerim undefined veya null? Benim kodum şu şekildedir:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  //DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Ancak bunu yaparsam, JavaScript yorumlayıcısı yürütmeyi durdurur.


1610
2018-04-15 18:12


Menşei


Kilitlenecek bu soruyu aday gösterebilir miyiz? Yeterli temsilcisi yok. @tats_innit - Aerovistae
@Aerovistae sadece <> diamond moderator, stackoverflow yazısını elle kilitleyebilir ve kilidini açabilir: meta.stackexchange.com/questions/22228/...  :) - Tats_innit


Cevaplar:


Niteliklerini kullanabilirsiniz soyut eşitlik operatörü Bunu yapmak için:

if (variable == null){
    // your code here.
}

Çünkü null == undefined doğru, yukarıdaki kod her ikisini de yakalayacaktır null ve undefined.


2201
2018-04-15 18:14



if (typeof variable === 'undefined' || !variable) { /* do things */ }; bu benim için çalışıyor - Ansd
@Ansd çözümünüz özel değildir undefined veya null. !variable herhangi bir falsi değeri için doğru olacaktır: '', 0, false, null, undefined, vb. - Douglas Ludlow
'==' çalışmasının neden ve '===' neden açıklamadığı var mı? Metadaki düzenleme konusuna baktım, fakat bu cevabın niçin '==' kullanıldığını ve bunun nasıl işlediğini açıklayan bir açıklamadan anlamıyorum. - LucyMarieJ
Kendi soruma cevap verdim. Özür. Cevabı burada buldum: stackoverflow.com/questions/5101948/...  Aynı karışıklığa sahip olan herkes için. - LucyMarieJ
Bunun başarısız olabileceği eski tarayıcı var mı? - donquixote


Yakalamanın standart yolu null ve undefined aynı anda:

if (variable == null) {
     // do something 
}

- Daha açık ancak daha az özlü olanlara% 100 eşdeğerdir:

if (variable === undefined || variable === null) {
     // do something 
}

Profesyonel JS yazarken, [tip eşitliği ve == vs ===] [1] anlaşılmaktadır. Bu yüzden kullanırız == ve sadece karşılaştırmak null.


Tekrar düzenle

Kullanımı öneren yorumlar typeof basitçe yanlış. Evet, buradaki değişkenim mevcut değilse yukarıdaki çözümüm bir ReferenceError'a neden olacaktır. Bu iyi birşey. Bu ReferenceError, arzu edilir: hatalarınızı bulmanıza ve kodunuzu göndermeden önce bunları düzeltmenize yardımcı olacak, tıpkı derleyici hatalarının diğer dillerde olduğu gibi.

Kodunuzda beyan edilmeyen değişkenlere başvurunuz olmamalıdır.


911
2018-01-22 03:01



Bu, bir ReferenceError'a neden olur ve eğer değişken tanımlanmamışsa veya kodda hiç belirtilmediyse, execeof daha güvenlidir. - Mani Gandham
Bu daha çok stilistik bir nokta. Değişken, bildirilmemişse herşeyBu gerçekten yazarın üzerine yazı yazıyor. Değişkeninizin bildirilip bildirilmediğini bilmelisiniz, bu bir soru olmamalı. Fakat Evet, eğer bir sebep Bu durumda, bu değiştirilmelidir window.variable sadece yerine değişkenbir referans hatasına neden olmaz. Tipik olarak kaçınılmalıdır. - Aerovistae
Evet yazdığın için !== yerine !=. - Aerovistae
-OP: Bu karşılaştırmaların "% 100 eşdeğeri" olmasıyla ilgili ifadesi, kendi EDIT'inizde belirttiğiniz gibi, SIMPLY WRONG'tır, ikincisi bir ReferenceError'a neden olacaktır. İddiaya gelince: "Kodunuzda beyan edilmeyen değişkenlere başvurunuz olmamalıdır." GERÇEKTEN Mİ? Opsiyonel Parametreleri hiç duydunuz mu? jsfiddle.net/3xnbxfsu - Timothy Kanski
İsteğe bağlı olarak sağlanmayan isteğe bağlı parametreler @TimothyKanski tanımlanamayabilir, ancak bunlar kesinlikle bildirilen değişkenlerdir. Onlar beyan ve bir değeri var undefinedbildirilen, ancak başlatılmamış değişkenler gibi, yani var someVar; bu yüzden argümanınız gerçekten durmuyor - chiliNUT


if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

177
2018-04-15 18:25



Sadece bunun başka bir yarı cevap olduğunu düşünmesi durumunda, aslında işe yarıyor. undefined eşit değerlendirir null. - Chuck
Krom konsolda bana başarısız oldu ... ReferenceError: değişken tanımlanmadı, bu yüzden işe yarayabilir, ama benim için değil ... - Eran Medan
Yalnızca bildirilen değişkenler için çalışır, bildirilebilecek veya bildirilmemiş değişkenler değildir, bu nadiren durumdur. (Bu durumda typeof + null bir çek kullanmanız gerekir)
Sadece çözmek Bu yorumu ekleyebilirsiniz: /*jshint eqnull:true */ JS belgenizin veya işlevinizin en üstüne ve JSHint kullanımlarınız hakkında sizi uyarmaya son verecek == null. - Web_Designer
@Aerovistae, bunu açıkça belirten bir referansa işaret edebilir misiniz? == kırılmış, bozulmuş. Zorlayıcı if(variable == null)Bu cevapta bana tam anlam ifade ediyor ... - Ben


Yukarıdaki cevapları birleştiren en eksiksiz cevap şöyle olurdu:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

Bu, bildirilmemiş veya bildirilmiş ve açıkça null veya undefined olarak ayarlanmış herhangi bir değişken için çalışmalıdır. Boolean ifadesi, gerçek olmayan boş bir değere sahip olan bildirilmiş değişkenler için false değerini değerlendirmelidir.


162
2017-10-11 17:02



@Aerovistae Bunu tanıdım typeof bir işlevsellik değil, bir işlevdir, bu yüzden parantezlere ihtiyaç duymaz, ancak yine de parantezleri takdir ediyorum - sadece açıklığı okumak için. - user664833
typeof kullanmak yerine doğrudan (variable === undefined) olup olmadığını kontrol etme? - Arjun U.
Değişkenin bildirilmemesi durumunda bir ReferenceError neden olacak @ArjunU. Bir değişkenin bildirilip bildirilmediğini bilmiyorsanız, yukarıdaki çözümü kullanın. Değişkenin en azından bildirildiğini garanti ederseniz, kullanabilirsiniz variable == null - Rogue
Bu daha iyi bir çözümdür çünkü @Rogue'un işaret ettiği gibi, değişken bildirilmeyebilir. - Abdul Sadik Yalcin
Eğer yanılıyorsam düzeltin, fakat ikincisinin birinci şartı, ikinci şartın bir parçası değil ve bu yüzden ikinci şartlı gereksiz mi? - March Ho


if (typeof EmpName != 'undefined' && EmpName) {

değer değilse, doğru olarak değerlendirir:

  • boş

  • Tanımsız

  • NaN

  • boş dize ("")

  • 0

  • yanlış


75
2018-05-07 07:24



Bunun vahşi ateş gibi yayılan tehlikeli bir teknik olduğunu düşünüyorum. Çünkü kontrol edilen değişkenlerin çoğu boole veya rakam olabilir. Yani kullanıcı sonuçları tam olarak anlamadıysa, bu iyi değildir. - usefulBee
Lütfen bu javascript özelliğine bir referans veriniz. - villamejia
Bu aynı if (EmpName). Eğer öyleyse undefined şimdiden falsi olacak. - Rudy
Değişken tanımlanmamışsa. sonra (EmpName) hata atarsa - Thamaraiselvam
@Thamaraiselvam Bence Rudy bunun bir anlamı olabilir. var EmpName; if (EmpName). Değişkenin tanımlandığı ancak bir değer atanmamış olduğu durumlarda. - hungerstar


jQuery attr() işlevi boş bir dize veya gerçek değeri döndürür (ve asla null veya undefined). Geri döndüğü tek zaman undefined senin selektörün herhangi bir eleman döndürmediği zamandır.

Yani boş bir dizgeye karşı test etmek isteyebilirsiniz. Alternatif olarak, boş dizeler, boş ve tanımsız false-y olduğundan, bunu yapabilirsiniz:

if (!EmpName) { //do something }

20
2018-04-15 18:20



Chrome 17.0.963.78 m bu hatayı veriyor: ReferenceError: EmpName is not defined - Eran Medan
@EranMedan Biliyorum bu gecikti, ama umarım buraya daha sonra gelen insanlara yardım eder. Bir hata almanızın nedeni, hiç bildirilmemesidir. Genellikle EmpName (veya başka bir değişken) bir işleve veya başka bir işlevin dönüş değerine geçirilip bildirildiğine karar verdiniz (Örnek: "var x;"). Tanımsız veya null veya boş dize döndürüp döndürmediğini test etmek için, yukarıdaki çözümü kullanabilirsiniz. - Dave


Bunu kullanmayı seviyorum:

if (!!variable) {
   //do something
}

Her ikisini de yakalar boş ve Tanımsız


13
2017-09-16 08:35



!! için yanlış döndürür null veya undefined. Yani bu, eğer değişken değişkeni null veya undefined değilse çalışır. - Dan
var d = 0; olarak başarısız olur !!d yanlış olarak değerlendirir - ainesophaur
Bu ayrıca boş dizeyi "yakalar", 0, NaN, ve false. Tamamen yanlış cevap. - Aerovistae
DownVoted çünkü bu cevap StackOverflow bilgi havuzunu zehirliyor. - mickmackusa


Kontrol etmek istediğiniz değişken global ise

if (window.yourVarName) {
    // Your code here
}

Bu şekilde kontrol etmek için bile bir hata atmayacaksınız yourVarName değişken mevcut değil.

Örnek: Tarayıcımın Geçmiş API'sini destekleyip desteklemediğini öğrenmek istiyorum

if (window.history) {
    history.back();
}

Bu nasıl çalışır:

window tüm global değişkenleri özelliklerini taşıyan bir nesnedir ve JavaScript'te mevcut olmayan bir nesne özelliğine erişmeye çalışmak yasaldır. Eğer history o zaman yok window.history döner undefined. undefined Falsey, yani kod if(undefined){} blok çalışmayacak.


9
2018-02-10 16:30



Okuyucular, bu gibi bir yaklaşımın, bir tarayıcıda çalışan JavaScript’ten - denetleme için deyimsel olduğunu unutmayın. global değişkeni bildirilmiştir ve özellikle tarayıcı tarafından sağlanan bir global (tarih API'si gibi) kullanılabilir. O çalışmayacak Küresel olmayan bir değişken olup olmadığını kontrol etmek için null veya undefinedJavaScript’iniz bir tarayıcı dışında çalışıyorsa (yani Node.js’de) çalışmaz. Ayrıca ayarlanmış olan küreleri tedavi edecek 0, false veya '' bildirilmemiş olanlarla aynı veya undefined veya null, genellikle iyi. - Mark Amery
Bu, komut dosyasının bir tarayıcıda çalıştığını varsayar. Bu verilen bir şey değil. - GreenAsJade


Bunun için kendi işlevimi yazmaya geldim ... javascript garip

Tam anlamıyla her şeyde kullanılabilir. (Bu, değişkende herhangi bir kullanılabilir olup olmadığını kontrol eder. değerler. Ama bu bilgi genellikle gerekli olduğu için, bence kayıt etmeye değer olduğunu düşünüyorum). Lütfen bir not bırakmayı düşünün.

function empty(v) {
        let type = typeof v;
        if(type === 'undefined') {
            return true;
        }
        if(type=== 'boolean') {
            return !v;
        }
        if(v === null) {
            return true;
        }
        if(v === undefined) {
            return true;
        }
        if(v instanceof Array) {
            if(v.length < 1) {
                return true;
            }
        }
        else if(type === 'string') {
            if(v.length < 1) {
                return true;
            }
            if(v==='0') {
                return true;
            }
        }
        else if(type === 'object') {
            if(Object.keys(v).length < 1) {
                return true;
            }
        }
        else if(type === 'number') {
            if(v===0) {
                return true;
            }
        }
        return false;
    }

Typescript uyumlu.

Düzenle. bu işlev yapmalı kesinlikle PHP'ler gibi aynı şey empty()fonksiyon (görmek RETURN VALUES)

Düşünüyor undefined, null, false, 0, 0.0, "0"  {}, [] boş olarak

"0.0", NaN, " ", true boş olmayan olarak kabul edilir.


7
2017-10-24 15:14



Biraz boş kontrol problemine girdim. Geçirilmekte olan bir parametrenin boş olup olmadığını veya boş bir nesne olup olmadığını kontrol etmek istiyorum { }. Bu yaygın ve aptalca bir dil sorunudur, ama unutmuştum. Tüm aramalarım, null değerinin tanımlanmamış veya eşitlik karşılaştırması (==), ancak katı eşitlik (===) veya eşdeğeri olmayan yanıtlar gösteriyor. Ve sonra burada -1 dereceli cevabınızda Çok dip Sayfanın başı (benden önce), beni aldatan cevaptır. Object.keys( obj ).length < 1 ya da belki de === 0, asla -1 olmayacağı varsayılır. Her neyse, 0'a kadar, woo. : p - user314159
Teşekkürler, bu işlevi bıraktım ve çok fazla kodu temizleyebildim. Neden bu standart bir JS fonksiyonu değil, benim için. - Andy
Değiştirmelisin herşey senin == için === Burada, bu makul bir işlev olurdu. - Ben McIntyre
@BenMcIntyre haklısın. Teşekkürler. - Blauhirn