JavaScript'te tanımsız veya boş bir değişken olup olmadığı nasıl kontrol edilir?


500

JavaScript kodumuzda sıklıkla aşağıdaki kod modelini kullanıyoruz

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

Aynı etkiye sahip daha az ayrıntılı bir kontrol yöntemi var mı?

Bazı forumlara ve literatüre göre, aşağıdakilerin basitçe söylenmesi aynı etkiye sahip olmalıdır.

if (some_variable)
{
    // Do something with some_variable
}

Ne yazık ki, Firebugsome_variable tanımsız olduğunda çalışma zamanında hata gibi bir ifadeyi değerlendirirken , ilki sadece bunun için iyi. Bu sadece Firebug'un (istenmeyen) bir davranışı mı yoksa bu iki yol arasında gerçekten bir fark var mı?


46
if(some_variable) { ... }eğer çalıştırmaz some_variableise falseya 0... ya
kennytm

iyi nokta;) Ama diyelim ki yanlış ya da 0 olamaz ve sadece bir mantıkta (dize, dizi vb.)
Kullanıp


2
... veya boş bir dize.
David

Yanıtlar:


333

Vakaları birbirinden ayırmanız gerekir:

  1. Değişkenler olabilir undefinedveya bildirilmemiş olabilir . Başka bir bağlamda bildirilmemiş bir değişkene erişirseniz hata alırsınız typeof.
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

Bildirilmiş ancak başlatılmamış bir değişken undefined .

let foo;
if (foo) //evaluates to false because foo === undefined
  1. Tanımsız özellikler , gibi someExistingObj.someUndefProperty. Tanımsız bir özellik bir hata vermez ve undefinedbir boole değerine dönüştürüldüğündefalse . Yani, umursamıyorsanız 0ve falsekullanmak if(obj.undefProp)tamam. Bu gerçeğe dayanan ortak bir deyim var:

    value = obj.prop || defaultValue

    " objözelliği varsa prop, atayın value, aksi takdirde varsayılan değeri atayın " anlamına gelir defautValue.

    Bazı insanlar, bulması zor hatalara yol açtığını ve inbunun yerine operatörün kullanılmasını önererek bu davranışı kafa karıştırıcı olarak düşünür.

    value = ('prop' in obj) ? obj.prop : defaultValue

1
Sonra hasOwnProperty ve prototipler hakkında konuşabilirsiniz. []! == [] içindeki 'indexOf' .hasOwnProperty ('indexOf')
Alsciende

1
Evet, bunu eklemeyi düşündüm, ancak kısalık için bütünlüğü feda etmeye karar verdim. ;)
user187291

52
0 ve yanlış sorununu ele almıyorsunuz
TMS

12
Beyan edilmemiş değişkenleri kastediyorsunuz . Bir değişken bildirilebilir, ancak yine de değeri vardır undefined.
Tgr

1
Ve ayrıca typeofbir dize döndürdüğünü unutmayın . Yani var myVar; typeof(myVar)==undefinedgeri falsegelmez true.
rism

417

"Değeridir için ben test etmek için en etkili yolu düşünmek nullveya undefinededilir"

if ( some_variable == null ){
  // some_variable is either null or undefined
}

Yani bu iki çizgi eşdeğerdir:

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

Not 1

Soruda belirtildiği gibi, kısa varyant some_variable bildirilmiş , aksi takdirde bir ReferenceError atılacaktır. Bununla birlikte, birçok kullanım durumunda bunun güvenli olduğunu varsayabilirsiniz:

isteğe bağlı bağımsız değişkenleri kontrol edin:

function(foo){
    if( foo == null ) {...}

varolan bir nesnenin özelliklerini denetleme

if(my_obj.foo == null) {...}

Öte yandan typeof, kayıt dışı küresel değişkenlerle başa çıkabilir (sadece geri döner undefined). Yine de, Alsciende'nin açıkladığı gibi, bu durumlar iyi nedenlerle en aza indirilmelidir.

Not 2

Bu - daha kısa - varyant eşdeğer değildir :

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

yani

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

Not 3

Genel olarak bunun ===yerine kullanılması önerilir ==. Önerilen çözüm bu kuralın bir istisnasıdır. JSHint sözdizimi denetleyicisi bile sağlareqnull bu nedenle seçeneği.

Gönderen jQuery stil kılavuzu :

== lehine katı eşitlik kontrolleri (===) kullanılmalıdır. Tek istisna, null yoluyla tanımsız ve null olup olmadığının kontrol edilmesidir.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

1
Çok önemli fark (btw sorusunda daha önce bahsedilmişti). Bu yüzden herkes typeof kullanır. Üzgünüm ama cevabınızın yararlı olduğu yere ulaşamıyorum, sadece soruda söylenenleri söylüyorsunuz ve ilk birkaç satırda bile yanlış olduğunu belirtiyorsunuz.
TMS

33
Üzgünüz, ama katılmıyorum ;-) Kullanma == nullimho 'null veya undefined' (soru konusu) için test etmek için en verimli olduğunu. Hiçbir zaman nadir değildir (jQuery 1.9.1'de 43 kez kullanılır), çünkü genellikle değişkenin bildirildiğini bilirsiniz - veya varolan bir nesnenin özelliğini test edersiniz if( o.foo == null).
mar10

1
@ mar10 (aUndefinedVar == null), "aUndefinedVar tanımlanmadı" hatası doğru değil.
Rannnn

7
Bu özlü seçenek için teşekkürler. Kodumun% 99'unda null ve undefined arasında ayrım yapmaya gerek yoktur, bu nedenle bu kontrolün kısalığı daha az karmaşık kod ile sonuçlanır.
Ian Lovejoy

1
Genel bir değişkeni denetlerken ReferenceError değerini önlemek için kullanın window.someProperty == null. Yerel değişkenler için, kolayca bildirildiklerinden emin olabilirsiniz: yazma if (...) {var local = ""}yazmak yerinevar local; if (...) { local = ""; }
Aloso

66

Null değerinin normal eşitlikle kontrol edilmesi de tanımsız için true değerini döndürecektir.

if (window.variable == null) alert('variable is null or undefined');

JS Eşitliği


4
NaN Nan'a eşit değil mi?
Sharjeel Ahmed

2
@monotheist NaN, NaN'ye eşit değildir (bkz. MDN'nin NaN sayfası ). Javascript bu davranışları belirten kayan noktaları için IEEE-754 kullanır. Bununla ilgili bazı düşünceler var, bkz. Stackoverflow.com/a/23666623/2563765
Steven

1
@SharjeelAhmed Matematiksel olarak düzeltildi. NaNfark denkleminden asla eşit olması beklenemez
Thaina

28

ES5 ve ES6 gibi daha yeni JavaScript standartlarında şunu söyleyebilirsiniz:

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

tümü yanlış döndürür, bu da Python'un boş değişkenleri kontrol etmesine benzer. Eğer bir değişkenin etrafına koşullu mantık yazmak istiyorsanız,

if (Boolean(myvar)){
   // Do something
}

burada "null" veya "boş dize" veya "tanımsız" etkin bir şekilde işlenir.


2
ie5 gibi desteklendi, neden daha iyi bilinmiyor !?
Himmators

12
OP sadece test farklı istedi nullve undefined, diğer falsy değerleri doğru dönmelidir!
Andre Figueiredo

1
Koşullu değer katmaz. Durum tam olarak aynı değerlendirir ve hala için false döndürür 0, NaN. Bu, nesneye bir referans göstermeden bir nesnenin gerçekliğini yakalamak istediğinizde, böylece onu potansiyel olarak büyük bir nesneden ziyade saklayabilirsiniz. FYI bu da !!valuebirincisi !gerçeği, ikincisi tekrar reddediyor.
erich2k8

> FYI bu aynı zamanda ilk olan !! değerine eşdeğerdir! gerçeği reddeder. Hangi FYI da if (var)boole dönüştürülecek eşdeğerdir , bu yüzden temelde tamamen işe yaramaz ...
Cyril CHAPON

2
Anlamıyla kelime kullanırken tanımsız , Boolean(undefined)çalışıyor, işleri o tanımsız ile değişken değil işi ve bu boş veya tanımlanmamış çeki yapmanın bütün noktasıdır. Bu: if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }"ReferenceError: undeclareVarName tanımlı değil" diyerek ReferenceError atar
Stephen P

22

Tanımlanmamış bir değişkene başvurmaya çalışırsanız, tüm JavaScript uygulamalarında bir hata atılır.

Nesnelerin özellikleri aynı koşullara tabi değildir. Bir nesne özelliği tanımlanmamışsa, ona erişmeye çalışırsanız bir hata atılmaz. Yani bu durumda kısaltabilirsiniz:

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

için

if (myObj.some_property != null)

Bunu göz önünde bulundurarak ve global değişkenlerin global nesnenin özellikleri olarak erişilebilir windowolması (bir tarayıcı durumunda), global değişkenler için aşağıdakileri kullanabilirsiniz:

if (window.some_variable != null) {
    // Do something with some_variable
}

Yerel kapsamlarda, değişkenlerin kod bloğunuzun üst kısmında bildirildiğinden emin olmak her zaman yararlıdır, bu, yinelenen kullanımlarından tasarruf sağlayacaktır typeof.


11
NaN, 0, "" ve yanlış nedeni kaçırırsınız.
Andreas Köberle

@ Andreas Köberle haklı. Katı olmayan eşitlik operatörü bile null değerinin NaN, 0, "" ve false değerinden farklı olduğunu söylüyor. if (myObj.some_property != null)Eşdeğer davranışlar elde etmek için yapmanız gerekir.
thejoshwolfe

15

Öncelikle ne test ettiğiniz konusunda çok net olmalısınız. JavaScript, sizi harekete geçirecek her türlü örtük dönüşüme ve iki farklı türde eşitlik karşılaştırıcısına sahiptir: ==ve ===.

Aşağıdaki özellikleri test(val)test eden nullveya undefinediçermesi gereken bir işlev :

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

Bakalım buradaki fikirlerden hangisi testimizi geçti.

Bu işler:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

Bunlar çalışmıyor:

typeof(val) === 'undefined'
!!val

Doğruluk ve performansı karşılaştırmak için bir jsperf girişi oluşturdumBu yaklaşımların . Farklı tarayıcılarda / platformlarda yeterli sayıda çalışma olmadığı için sonuçlar şimdilik kesin değil. Testi bilgisayarınızda çalıştırmak için bir dakikanızı ayırın!

Şu anda, basit val == nulltestin en iyi performansı verdiği görülmektedir . Aynı zamanda çok kısa. val != nullTamamlayıcıyı istiyorsanız test reddedilebilir .


12

==kullanılması gereken tek durum budur :

if (val == null) console.log('val is null or undefined')

3
Bu cevabın 2019 dolaylarında olması upvotes eksikliğine sahip, ancak bu kullanım durumu için KISS cevabı var. Ayrıca val != nulltam tersi için, sadece bir = ve @Yukulele başına beri onu kullanmak için SADECE ==onu görmek zaman ne olduğunu bilecek.
DKebler

7

Tek bir tam ve doğru cevap olmadığından özetlemeye çalışacağım:

Genel olarak, ifade:

if (typeof(variable) != "undefined" && variable != null)

sadeleştirilemez, çünkü variablebildirilmemiş olabilir , bu nedenle atlanması typeof(variable) != "undefined"ReferenceError ile sonuçlanır. Ancak, ifadeyi bağlama göre basitleştirebilirsiniz :

Eğer variablebir küresel şunları yapmanız kolaylaştırabilirsiniz:

if (window.variable != null)

Eğer durum bu ise yerel , bu değişken atanarak edildiğinde muhtemelen durumlardan kaçınmak ve ayrıca kolaylaştırabilirsiniz:

if (variable != null)

Eğer öyleyse nesne özelliği , sen ReferenceError konusunda endişelenmenize gerek yoktur:

if (obj.property != null)

navigatorParçası mı window? Bir istisna navigator is not definedaldığımızda window.navigator != nulltesti kullanabilir miyiz ?
jww

5

Değişkenin bir değeri olup olmadığını kontrol edebilirsiniz. anlam,

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

Bir değişkenin olup olmadığını bilmiyorsanız (yani, bildirilmişse) typeof operatörüne danışmalısınız. Örneğin

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

4

Bunu bu yöntemi kullanarak yaptım

kimliği bazı değişkenlere kaydet

var someVariable = document.getElementById("someId");

sonra koşul kullanın

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

3

Cevaplardan birinde belirtildiği gibi, küresel bir kapsama sahip bir değişken hakkında konuşuyorsanız şanslı olabilirsiniz. Bildiğiniz gibi, global olarak tanımladığınız değişkenler windows nesnesine ekleme eğilimindedir. Bu gerçeğin avantajlarından faydalanabilirsiniz, böylece bleh adlı bir değişkene eriştiğinizi varsayalım, sadece çift ters çevrilmiş operatörü kullanın (!!)

!!window['bleh'];

Bleh bildirilmemiş ve bir değer atanmamışken, bu bir yanlış döndürür.



3

Bu, ==yerine kullanılması tavsiye edilen çok nadir bir duruma bir örnektir ===. İfade somevar == nulliçin de geçerli dönecektir undefinedvenull için her şey için , ancak diğer her şey için false döndürür (değişken bildirilmezse bir hata).

Kullanmak != beklendiği gibi sonuç çevirmek olacaktır.

Modern editörler kullanarak uyarmak olmaz ==ya !=operatörü ilenull , neredeyse her zaman istenen davranış olduğundan, kullanım uyarmazlar.

En yaygın karşılaştırmalar:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

Kendin dene:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

2

yyy tanımsız veya null olursa olsun , doğru dönecektir

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

Evet

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

Hayır


2

Tarayıcınızda Geliştirici araçlarını açın ve aşağıdaki resimde gösterilen kodu deneyin.

img1 img2


2

Anlamak için, tanımlanmamış, null ve '' (Boş bir dize de) dönüştürürken Javascript Altyapısı tarafından döndürülen değerin ne olacağını analiz edelim. Aynı şeyi doğrudan geliştirici konsolunuzdan da kontrol edebilirsiniz.

resim açıklamasını buraya girin

Her şeyin yanlış olana dönüştüğünü görebilirsiniz, bu üçünün hepsinin javascript tarafından 'varlık eksikliği' olduğunu varsaydığı anlamına gelir. Bu nedenle, kodunuzdaki üçünün tümünü aşağıdaki gibi açıkça kontrol etmenize gerek yoktur.

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

Ayrıca bir şey daha belirtmek istiyorum.

Boolean'ın (0) sonucu ne olacak?

Elbette yanlış. 0, beklenen sonuçlarınızda geçerli bir değer olduğunda kodunuzda bir hata oluşturur. Bu yüzden lütfen kodu yazarken bunu kontrol ettiğinizden emin olun.


2

Sahip olduğunuza benzer şekilde,

if (some_variable === undefined || some_variable === null) { do stuff }


0

Nullity ( if (value == null)) veya nullity ( if (value != null)) öğesinin test edilmesi, bir değişkenin tanım durumunu test etmekten daha az ayrıntılıdır.

Ayrıca, bir boole değeri ile tanımlanmışsa değişkeninizin (veya nesne özelliğinizin) varlığını sağlamak için yapılan test if (value)(veya if( obj.property)) başarısız olur false. Uyarı emptor :)


0

Her iki değer de katı karşılaştırma operatörü kullanılarak kolayca ayırt edilebilir:

Çalışma örneği:

http://www.thesstech.com/tryme?filename=nullandundefined

Basit kod:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}

0

İf ifadesinin amacı , bir değişkene değer atamadan önce nullveya undefineddeğerleri kontrol etmekse , tarayıcı desteği sınırlı olmasına rağmen , Nullish Coalescing Operator'ı kullanabilirsiniz . Caniuse verilerine göre , tarayıcıların sadece% 48,34'ü desteklenmektedir (Nisan 2020 itibariyle).

const a = some_variable ?? '';

Bu değişken boş bir dizeye (veya başka bir varsayılan değer) atanacak sağlayacaktır some_variableolduğu nullveyaundefined .

Bu işleç, 0ve gibi diğer falsy değeri türleri için varsayılan değeri döndürmediği için kullanım durumunuz için en uygundur ''.


-1

Bu formun bir işlevini tanımlamanız gerekir:

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

Değişken bildirilmezse aynı ReferenceError oluşturur.
Çad

-1

ES5 veya ES6'da birkaç kez kontrol etmeniz gerekiyorsa:

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}


-1

Ramda ile Lodash R.isNil(yourValue) ve diğer yardımcı kütüphanelerin aynı işlevi görmesini sağlayabilirsiniz.

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.