JavaScript'te null değerleri nasıl kontrol ederim?


573

JavaScript'te null değerleri nasıl kontrol edebilirim? Aşağıdaki kodu yazdım ama işe yaramadı.

if (pass == null || cpass == null || email == null || cemail == null || user == null) {      

    alert("fill all columns");
    return false;  

}   

JavaScript programımda hataları nasıl bulabilirim?


Test ettiğiniz değerlerin gerçekten boş olduğundan ve yalnızca boş bir dize olduğundan emin misiniz?
Jan-Peter Vos

72
nulljs testi sıkı operatör ile yapılmalıdır===
davin

3
@davin - true, ama burada sorun değil çünkü eğer açıklama olsaydı hala işe yarayacaktı.
Mark Kahn

3
@cwolves, sorun olduğunu düşünürsem bu yorumu bir cevap haline getirirdim. İfadelerime göz atın, OP'nin pratiğine istinaden dil hakkında açıkça genel bir açıklama yapıyorum ve bunun sorununu çözmesini önermiyorum.
davin

2
@ TRiG önerilen değişiklikler temel olarak sorunun doğasını, cevapların (sadece benim değil) bağlamı kaybettiği ve anlamlı olmadığı noktaya değiştirmektedir. Düzenleme sadece bir yorum olmalıdır.
ic3b3rg

Yanıtlar:


741

Javascript, "null" değerleri kontrol etme konusunda çok esnektir. Aslında bu daha basit kod işe yarayacak, boş dizeleri arıyorsanız tahmin ediyorum:

if(!pass || !cpass || !email || !cemail || !user){

Boş dizeleri (kontrol edecektir Hangi ""), null, undefined, falseve sayılar 0veNaN

Özellikle numaralar için denetleniyor eğer bayan sıkça yapılan bir hatadır olduğunu lütfen not 0bu yöntemle ve num !== 0tercih edilir (veya num !== -1veya ~num(hacky kod olması da denetler karşı -1)) işlevleri için bu dönüş -1, örneğin indexOf)


4
Bu testin hangi bölümlerinin hangi değerler için olduğunu bilmek çok yararlı olacaktır. Bazen özellikle birini arıyorsunuz.
inorganik

2
Biraz geç bir açıklama, ama evet, her biri @inorganik karşı test yapabilirsiniz, aşağıdaki cevabım bakın
WebWanderer

28
Okuyucular, lütfen sayısal veriler üzerinde bu tür bir test kullanırken dikkatli olun. Kullanmayın !veya !!testine nullveya undefinedayrıca 0. değerlerini atmak istemiyorsanız tipik sayısal verilere
Nicks

4
Cevabın kendisi şöyle diyor: "... ve rakamlar 0...". Bağlam verildiği gibi bu cevabın soru için mükemmel bir şekilde uygun olduğuna inanıyorum (inferring ettiğim "kullanıcı adı, şifre, e-posta"), 0değerleri kontrol etmiyorlar . Bununla birlikte, bu sorunun ve cevabın popülerliği göz önüne alındığında, cevabın kendisinde belirtmeye değer olduğunu kabul ediyorum.
Mark Kahn

4
@Hendeca - rulo gözler Git gerçek sorudaki kodu okuyun. Bu oluyor açıkça kullanıcı adı ve şifre soruyor. Hiçbir şey tahmin etmiyorum, sadece kibardı. Sordukları şeylere değil, neye ihtiyaç duyduklarına cevap verdiğim gerçeğinden rahatsız oluyorsun , bu saçma. Bu SO, çoğu zaman insanlar ne istediklerini bilmiyorlar. Orijinal soru bağlamında bu cevap doğrudur. Şimdi gürültü eklemeyi bırakın.
Mark Kahn

418

Null değerini ÖZEL OLARAK kontrol etmek için şunu kullanırsınız:

if (variable === null)

Bu test edecek SADECE için geçmesi nullve geçemezsin "", undefined, false, 0, veya NaN.

Ayrıca, her "yanlış benzeri" değeri (biri için doğru dönecekti !variable) için mutlak denetimler sağladım .

Bazı mutlak denetimler için absolutely equals: ===ve öğelerinin kullanımını uygulamanız gerekeceğini unutmayın typeof.

Burada tüm bireysel testleri göstermek için bir JSFiddle oluşturdum

Her kontrolün çıktısı:

Null Test:

if (variable === null)

- variable = ""; (false) typeof variable = string

- variable = null; (true) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Empty String Test:

if (variable === '')

- variable = ''; (true) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number




Undefined Test:

if (typeof variable == "undefined")

-- or --

if (variable === undefined)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (true) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



False Test:

if (variable === false)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (true) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Zero Test:

if (variable === 0)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (true) typeof variable = number

- variable = NaN; (false) typeof variable = number



NaN Test:

if (typeof variable == 'number' && !parseFloat(variable) && variable !== 0)

-- or --

if (isNaN(variable))

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (true) typeof variable = number

Gördüğünüz gibi, test etmek biraz daha zor NaN;


9
===Sıkı eşitlik kullanırsanız tip kontrolünün amacı nedir ? Teşekkürler. Ayrıca NaN testi için bunu sadece değişken NaN'ye eşitse isNaN(value)dönecektir true.
Michael Malinovskij

16
variable === null"Nesne" türünde olan ancak olmayan bir durum var mı ? Yoksa, neden variable === nullikinci konjonktürü atarak kontrolü basitleştirmeyesiniz ? Teşekkürler.
Hunan Rostomyan

7
@HunanRostomyan İyi soru ve dürüst olmak gerekirse, hayır, olduğunu düşünmüyorum. Muhtemelen buradavariable === null sadece bu JSFiddle'da test ettiğim kadar güvenli . `` && typeof variable === 'object' 'i kullanmamın nedeni, yalnızca bir nulldeğerin typeof olduğu ilginç gerçeğini göstermek değil object, aynı zamanda diğer kontrollerin akışına devam etmekti . Ama evet, sonuç olarak, sadece kullanmak güvenlidir variable === null.
WebWanderer

1
jsfiddle.net/neoaptt/avt1cgem/1 İşte bu cevap fonksiyonlara ayrılmıştır. Çok yararlı değil, ama yine de yaptım.
Neoaptt

1
Neredeyse hiç iyi bir fikir olmayan bir şey yapacağım: Bu cevaptaki kodu değiştirin. Özellikle, null değerini kontrol ederken, yazım nesnesi için tamamen gereksiz olan testi kaldırın. Bu temel bir kod snippet'idir: tek bir yeni başlayanın bile bu ayrıntılı testi yapmaları gerektiğini yanlış öğrenmeleri iyi bir fikir değildir .
ToolmakerSteve

59

yerine her yerde ==ile değiştirin ===.

== gevşek veya soyut bir eşitlik karşılaştırmasıdır

=== sıkı bir eşitlik karşılaştırmasıdır

Daha fazla ayrıntı için Eşitlik karşılaştırmaları ve benzerlik hakkındaki MDN makalesine bakın .


2
Bu sadece undefinedolmamanızı düşünüyorsanız çalışır null. Aksi takdirde beklenmedik davranışlara yol açacaktır. Genellikle hem null/ hem de undefinedfalsili değerlerle ilgileniyorsanız, o zaman kullanın ==(bunu yapmanız gereken birkaç durumdan biri).
Andrew Mao

2
@AndrewMao undefined değil null : stackoverflow.com/a/5076962/753237
ic3b3rg

2
Gerçekten @AndrewMao'nun söylediklerine inanıyorum. İlk cümlesi yeniden yazılabilir "Bu yalnızca tanımsız ve null'un pratik eşdeğer olmadığı durumlarda işe yarar."
BobRodes

1
@BobRodes Zavallı yazımı açıkladığın için teşekkürler, minnettarım :)
Andrew Mao

@AndrewMao Çok hoş geldiniz. Ben şahsen yazınızı fakir olarak adlandırmam; Ortalamadan daha iyi bir anlaşma olduğunu söyleyebilirim. :)
BobRodes

30

Sıkı eşitlik operatörü: -

Biz null tarafından kontrol edebilirsiniz ===

if ( value === null ){

}

Sadece kullanarak if

if( value ) {

}

değer değilse doğru olarak değerlendirilir :

  • boş
  • Tanımsız
  • NaN
  • boş dize ("")
  • yanlış
  • 0

9

nullBasitleştirilmiş bir sözdizimini açıkça kontrol ederek kabul edilen cevap üzerinde iyileştirme :

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
}

// Test
let pass=1, cpass=1, email=1, cemail=1, user=1; // just to test

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
    console.log ("Yayy! None of them are null");
} else {
    console.log ("Oops! At-lease one of them is null");
}


6

İlk olarak, işlev gövdesi olmayan bir return deyiminiz vardır. Büyük olasılıkla bir hata verir.

Çekinizi yapmanın daha temiz bir yolu! Şebeke:

if (!pass || !cpass || !email || !cemail || !user) {

    alert("fill all columns");

}

12
Bu kod muhtemelen bir işlevdedir, sadece göstermedi;)
Mark Kahn

4

nihayet try catch kullanabilirsiniz

 try {
     document.getElementById("mydiv").innerHTML = 'Success' //assuming "mydiv" is undefined
 } catch (e) {

     if (e.name.toString() == "TypeError") //evals to true in this case
     //do something

 } finally {}   

throwkendi hatalarınızı da yapabilirsiniz . Bkz bu .


1
Bu 'paranoyak' kodu olarak nitelendirdi düşünüyorum. gerçekten böyle bir şey yazdıysanız, "mydiv" in muhtemelen var olamayacağı anlayışıyla olurdu. durumdan emin olmadığımız sürece bu koda ulaşmamalıyız ve böyle bir çizgiyi denemeden önce emin olduğumuzdan emin olmak için yanıt kodları gibi birçok yolumuz olurdu.
calql8edkos

Kontrol akışı için try ve catch kullanmayın. Bu iyi bir çözüm değil.
Andrew S

4

JavaScript'te hiçbir dize eşit değildir null.

Belki de boş bir dize olduğunda pass == nulldoğru olmanız beklenir passçünkü gevşek eşitlik operatörünün ==belirli türlerde baskı uyguladığının farkındasınızdır .

Örneğin, bu ifade doğrudur:

'' == 0

Buna karşılık, katı eşitlik operatörü ===bunun yanlış olduğunu söylüyor:

'' === 0

Bu göz önüne alındığında ''ve 0gevşek bir şekilde eşit olduğunda, bunu ''ve nulleşit derecede eşit olduğunu makul bir şekilde tahmin edebilirsiniz . Ancak, öyle değiller.

Bu ifade yanlıştır:

'' == null

Herhangi bir dizeyi karşılaştırmanın sonucu nullyanlıştır. Bu nedenle, pass == nullve diğer tüm testleriniz her zaman yanlıştır ve kullanıcı hiçbir zaman uyarıyı almaz.

Kodunuzu düzeltmek için her bir değeri boş dizeyle karşılaştırın:

pass === ''

Bunun passbir dize olduğundan eminseniz , pass == ''yalnızca boş bir dize boş dizeye gevşek bir şekilde eşit olduğu için de çalışır. Öte yandan, bazı uzmanlar, özellikle gevşek eşitlik operatörünün uyguladığı tür baskısını yapmak istemiyorsanız, JavaScript'te her zaman sıkı eşitliği kullanmanın iyi bir uygulama olduğunu söylüyor.

Hangi değer çiftlerinin gevşek bir şekilde eşit olduğunu bilmek istiyorsanız , bu konuyla ilgili Mozilla makalesinde "Eşlik karşılaştırmaları" tablosuna bakın .


4

Javascript'te undefined ve null olup olmadığını kontrol etmek için sadece aşağıdakileri yazmanız gerekir:

if (!var) {
        console.log("var IS null or undefined");
} else {
        console.log("var is NOT null or undefined");
}

6
! var, 0, "", NaN ve false ile de doğrudur.
Matt

3

Bu WebWanderer NaN kontrol ile ilgili bir yorum (henüz resmi bir yorum bırakmak için yeterli temsilcisi yok). Çözüm şu şekilde okunur

if(!parseInt(variable) && variable != 0 && typeof variable === "number")

ancak bu yuvarlamak olur rasyonel sayılar için başarısız olur 0gibi variable = 0.1. Daha iyi bir test:

if(isNaN(variable) && typeof variable === "number")

1
Gabriel'e işaret ettiğin için teşekkürler, düzeltmeyi cevabımın içine koydum. Bunun dışında, ben değiştirerek testi düzeltmek başardı parseIntiçin parseFloat (ilk etapta bana açık olmalıydı ki). Bu isNanfonksiyonu kullanmaktan kaçındım çünkü birçok geliştirici isNaN, değerlerin girdiği ve booleanların ortaya çıktığı bir çeşit "sihirli kutu" gibi fonksiyonları görüyormuş gibi hissediyorum ve testi biraz daha derinlemesine incelemek istedim. Ancak evet, önerilen testiniz işe yarayacak ve kullanımı gayet iyi. Üzgünüm, şimdiye kadar gönderinizi fark etmedim.
WebWanderer

1
Harika, işe yarıyor gibi görünüyor. Neden kaçındığına dair yorum için teşekkürler isNaN, bu mantığın arkasına geçebilirim. Daha da karmaşık / kara kutu gibi görünen ancak avantajı olduğu için dikkat çekmeye değer olan Underscore.js yöntemi de var NaN !== NaN. Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
Gabriel

2

Aslında kullanmanız gerekebileceğini düşünüyorum if (value !== null || value !== undefined) çünkü kullanırsanız if (value)0 veya yanlış değerleri de filtreleyebilirsiniz.

Bu iki işlevi göz önünde bulundurun:

const firstTest = value => {
    if (value) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}
const secondTest = value => {
    if (value !== null && value !== undefined) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}

firstTest(0);            // result: failed
secondTest(0);           // result: passed

firstTest(false);        // result: failed
secondTest(false);       // result: passed

firstTest('');           // result: failed
secondTest('');          // result: passed

firstTest(null);         // result: failed
secondTest(null);        // result: failed

firstTest(undefined);    // result: failed
secondTest(undefined);   // result: failed

Benim durumda, sadece değer boş olup olmadığını kontrol etmek gerekli ve tanımsız ve ben filtreye istemiyordu 0ya falseya ''değerlere. bu yüzden ikinci testi kullandım, ancak ilk testi kullanmanıza neden olabilecek olanları da filtrelemeniz gerekebilir.


1

Değerin boş olup olmadığını sınamak için başka bir yol buldum:

if(variable >= 0 && typeof variable === "object")

nullaynı zamanda numberve gibi davranır object. null >= 0Veya karşılaştırma null <= 0sonuçları true. Karşılaştırıldığında null === 0veya null > 0veya null < 0yanlış olur. Ama aynı nullzamanda bir nesne olduğu gibi onu bir null olarak algılayabiliriz.

Ben daha karmaşık işlevin yapılan doğasıylailgili cadı typeof daha iyi yapacak ve dahil etmek veya gruplandırılmış tutmak ne tür anlattı edilebilir

/* function natureof(variable, [included types])
included types are 
    null - null will result in "undefined" or if included, will result in "null"
    NaN - NaN will result in "undefined" or if included, will result in "NaN"
    -infinity - will separate negative -Inifity from "Infinity"
    number - will split number into "int" or "double"
    array - will separate "array" from "object"
    empty - empty "string" will result in "empty" or
    empty=undefined - empty "string" will result in "undefined"
*/
function natureof(v, ...types){
/*null*/            if(v === null) return types.includes('null') ? "null" : "undefined";
/*NaN*/             if(typeof v == "number") return (isNaN(v)) ? types.includes('NaN') ? "NaN" : "undefined" : 
/*-infinity*/       (v+1 === v) ? (types.includes('-infinity') && v === Number.NEGATIVE_INFINITY) ? "-infinity" : "infinity" : 
/*number*/          (types.includes('number')) ? (Number.isInteger(v)) ? "int" : "double" : "number";
/*array*/           if(typeof v == "object") return (types.includes('array') && Array.isArray(v)) ? "array" : "object";
/*empty*/           if(typeof v == "string") return (v == "") ? types.includes('empty') ? "empty" : 
/*empty=undefined*/ types.includes('empty=undefined') ? "undefined" : "string" : "string";
                    else return typeof v
}

// DEMO
let types = [null, "", "string", undefined, NaN, Infinity, -Infinity, false, "false", true, "true", 0, 1, -1, 0.1, "test", {var:1}, [1,2], {0: 1, 1: 2, length: 2}]

for(i in types){
console.log("natureof ", types[i], " = ", natureof(types[i], "null", "NaN", "-infinity", "number", "array", "empty=undefined")) 
}


1

Harikalar yaratan bu çok basit işlevi yaptım:

function safeOrZero(route) {
  try {
    Function(`return (${route})`)();
  } catch (error) {
    return 0;
  }
  return Function(`return (${route})`)();
}

Rota, patlayabilen değerler zinciridir. Bunu jQuery / cheerio ve nesneler için kullanıyorum.

Örnek 1: Bunun gibi basit bir nesne const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};.

Ama henüz yapmadığımız çok büyük bir nesne olabilir. Bu yüzden geçiyorum:

let value1 = testobj.items[2].val;  // "hum!"
let value2 = testobj.items[3].val;  // Uncaught TypeError: Cannot read property 'val' of undefined

let svalue1 = safeOrZero(`testobj.items[2].val`)  // "hum!"
let svalue2 = safeOrZero(`testobj.items[3].val`)  // 0

Tabii ki isterseniz nullveya kullanabilirsiniz 'No value'... İhtiyacınız ne olursa olsun.

Genellikle bir DOM sorgusu veya jQuery seçici bulunmazsa bir hata verebilir. Ama şöyle bir şey kullanmak:

const bookLink = safeOrZero($('span.guidebook > a')[0].href);
if(bookLink){
  [...]
}

1

Lodash modülünü, değerin boş veya tanımsız olduğunu kontrol etmek için kullanabilirsiniz

_.isNil(value)
Example 

 country= "Abc"
    _.isNil(country)
    //false

   state= null
    _.isNil(state)
    //true

city= undefined
    _.isNil(state)
    //true

   pin= true
    _.isNil(pin)
    // false   

Referans bağlantısı: https://lodash.com/docs/#isNil


0

DB için ex için gelen Boolean değerleri durumunda bu çalışmaz:

 value = false

 if(!value) {
   // it will change all false values to not available
   return "not available"
 }

0

Bir değişken bildirildiğinde ancak değer atanmamışsa JAVASCRIPT içindeki AFAIK , türü . bu yüzden bunun bir olacağını bile değişkeni kontrol edebilirsiniz bazı tutma örneği yerine değeri .undefinedobject

döndüren geçersizliği kontrol etmek için bir yardımcı yöntem oluşturun trueve bunu API'nızda kullanın.

değişkenin boş olup olmadığını kontrol etmek için yardımcı fonksiyon:

function isEmpty(item){
    if(item){
        return false;
    }else{
        return true;
    }
}

try-catch istisnai API çağrısı:

try {

    var pass, cpass, email, cemail, user; // only declared but contains nothing.

    // parametrs checking
    if(isEmpty(pass) || isEmpty(cpass) || isEmpty(email) || isEmpty(cemail) || isEmpty(user)){
        console.log("One or More of these parameter contains no vlaue. [pass] and-or [cpass] and-or [email] and-or [cemail] and-or [user]");
    }else{
        // do stuff
    }

} catch (e) {
    if (e instanceof ReferenceError) {
        console.log(e.message); // debugging purpose
        return true;
    } else {
        console.log(e.message); // debugging purpose
        return true;
    }
}

bazı test durumları:

var item = ""; // isEmpty? true
var item = " "; // isEmpty? false
var item; // isEmpty? true
var item = 0; // isEmpty? true
var item = 1; // isEmpty? false
var item = "AAAAA"; // isEmpty? false
var item = NaN; // isEmpty? true
var item = null; // isEmpty? true
var item = undefined; // isEmpty? true

console.log("isEmpty? "+isEmpty(item));

1
Ne? Bu cevabın bu yazı ile ilgisi yok. Bu cevabı yanlışlıkla bu konuya mı gönderdiniz?
WebWanderer

Bu isEmptyişlev aynen davranır !. Bir işlev icat etmeye gerek yok. Sadece yap if (!pass || !cpass || !email ...). (Kabul edilen cevapta zaten gösterilmektedir.) Ve WebWanderer'ın yorumuna göre, bu yazının orta kısmı olan "try-catch istisnai API çağrısı", bu soru ile alakalı görünmüyor. Lütfen niyetinizi açıklayın - bu ne zaman işe yarar? Bunun soru ile ilişkisi nedir?
ToolmakerSteve

0

Hata durumlarını kontrol etme:

// Typical API response data
let data = {
  status: true,
  user: [],
  total: 0,
  activity: {sports: 1}
}

// A flag that checks whether all conditions were met or not
var passed = true;

// Boolean check
if (data['status'] === undefined || data['status'] == false){
  console.log("Undefined / no `status` data");
  passed = false;
}

// Array/dict check
if (data['user'] === undefined || !data['user'].length){
  console.log("Undefined / no `user` data");
  passed = false;
}

// Checking a key in a dictionary
if (data['activity'] === undefined || data['activity']['time'] === undefined){
   console.log("Undefined / no `time` data");
   passed = false;
}

// Other values check
if (data['total'] === undefined || !data['total']){
  console.log("Undefined / no `total` data");
  passed = false;
}

// Passed all tests?
if (passed){
  console.log("Passed all tests");
}

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.