JS'de bir değerin null olmadığı ve boş dize olmadığı nasıl kontrol edilir


86

Javascript'te bir değerin null olmadığına ve boş dizge olmadığına dair herhangi bir kontrol var mı? Aşağıdakini kullanıyorum:

var data; //get its value from db 
if(data != null && data != '') {
   // do something
}

Ama daha iyi bir çözüm olup olmadığını merak ediyorum. Teşekkürler.


6

1
Bunu denedim ama iki vakadan birinde işe yaramadı.
ivva

herkese teşekkürler, bunu deneyeceğim. Umarım işe yarar.
ivva

undefinedmantığınıza göre tetiklemesi gereken // do somethingancak tetiklemeyen özel durumlardan biridir .
Salman

Yanıtlar:


163

Bir değişkenin null olmadığını ve özellikle boş bir dizge olmadığını gerçekten onaylamak istiyorsanız, şunu yazarsınız:

if(data !== null && data !== '') {
   // do something
}

Tür eşitliğini ( !==| ===) kontrol etmek için kodunuzu değiştirdiğime dikkat edin .

Bununla birlikte, bir kodun yalnızca "makul" değerler için çalışacağından emin olmak istiyorsanız, diğerlerinin de belirttiği gibi, şunu yazabilirsiniz:

if (data) {
  // do something
}

Javascript'te hem boş değerler hem de boş dizeler yanlış (yani null == false) 'a eşittir .

Kodun bu 2 bölümü arasındaki fark, ilki için, özellikle null olmayan veya boş bir dize olmayan her değerin if. Ama, ikinci birinde, her gerçek-imsi değeri girecek if: false, 0, null, undefinedve boş dizeleri, olmaz.


2
0 pek çok durumda makul bir değerdir
Aequitas

3
bu yüzden makul kelimesi tırnak işaretleri ile sarılmıştır :)
Gershon Papi

@Adam Değilse, boş bırakıp başka bir tane kullanabilirsiniz. Bu her zaman beklendiği gibi tersine döner.
Nate

Bunun veri olması gerekmez! == null || data! == '' yerine &&?
Imdad

@Imdad OP, değerin boş olup olmadığını VE boş bir dize olmadığını kontrol etmesini istedi, bu yüzden hayır.
Gershon Papi

18

Hem nullhem de boş bir dize, JS'de yanlış değerlerdir. Bu nedenle,

if (data) { ... }

tamamen yeterlidir.

Yine de yandan bir not: Kodumda farklı türlerde tezahür edebilecek bir değişken bulundurmaktan kaçınırdım. Veriler sonunda bir dizge olacaksa, başlangıçta değişkenimi boş bir dizeyle tanımlardım, böylece bunu yapabilirsiniz:

if (data !== '') { ... }

boş (veya benzeri tuhaf şeyler data = "0") araya girmeden .


11

Kullanmak yerine

if(data !== null && data !== ''  && data!==undefined) {

// do something
}

Aşağıdaki basit kodu kullanabilirsiniz

if(Boolean(value)){ 
// do something 
}
  • 0, boş bir dize, null, undefined ve NaN gibi sezgisel olarak "boş" olan değerler yanlış olur
  • Diğer değerler gerçek oluyor

6

Sık sık doğru değeri ve ayrıca dizedeki boş alanları test ederim:

if(!(!data || data.trim().length === 0)) {
  // do something here
}

Bir veya daha fazla boş alan içeren bir dizeniz varsa, doğru olarak değerlendirilir.


4
if (data?.trim().length > 0) {
   //use data
}

?. isteğe bağlı zincirleme operatör kısa devre ve dönecektir undefinedVeri ise nullish( nullveya undefined) yanlış değerlendirecek olan ifekspresyon.


Dürüst olmak gerekirse bu operatörü bilmiyordum .. maalesef birkaç Android tarayıcısı bunu desteklemiyor, ancak aksi takdirde destek oldukça iyi!
brandonmack

2

Hem null hem de boş aşağıdaki gibi doğrulanabilir:

<script>
function getName(){
    var myname = document.getElementById("Name").value;
    if(myname != '' && myname != null){
        alert("My name is "+myname);
    }else{
        alert("Please Enter Your Name");
    }       
}


1

dene ----------

function myFun(){
var inputVal=document.getElementById("inputId").value;
if(inputVal){
document.getElementById("result").innerHTML="<span style='color:green'>The value is "+inputVal+'</span>';
}
else{
document.getElementById("result").innerHTML="<span style='color:red'>Something error happen! the input May be empty.</span>";
}
}
<input type="text" id="inputId">
<input type="button" onclick="myFun()" value="View Result">
<h1 id="result"></h1>


1

Özünde boş kodladığımızda, koşullar göz önüne alındığında aşağıdakilerden herhangi biri anlamına gelebilir;

  • 0 sayı değerinde olduğu gibi
  • 0.0 float değerinde olduğu gibi
  • Dize değerinde olduğu gibi '0'
  • Dize değerinde olduğu gibi '0.0'
  • Boş değerde olduğu gibi null, şans eseri tanımsız yakalayabilir veya olmayabilir
  • tanımsız değerde olduğu gibi tanımsız
  • yanlış doğru değerde olduğu gibi, şans eseri olarak 0 da doğru ama yanlışı olduğu gibi yakalamak istiyorsak
  • beyaz boşluk veya sekme içermeyen boş iğne değeri
  • '' beyaz boşluk veya sekme içeren dizge

Gerçek hayatta, OP'nin belirttiği gibi, hepsini test etmek isteyebiliriz veya zaman zaman sadece sınırlı bir dizi koşul için test etmek isteyebiliriz.

Genel olarak if(!a){return true;} çoğu zaman amacına hizmet eder, ancak daha geniş koşulları kapsamaz.

Turunu yapan bir başka hack ise return (!value || value == undefined || value == "" || value.length == 0);

Peki ya tüm süreç üzerinde kontrole ihtiyacımız olursa?

Yerel çekirdek JavaScript'te basit bir kırbaç çözümü yoktur, benimsenmesi gerekir. Eski IE11 desteğini bıraktığımızı düşünürsek (dürüst olmak gerekirse, pencereler bile öyle yapmalıyız) aşağıdaki tüm modern tarayıcılarda hayal kırıklığı yaratan çalışmalardan doğan çözüm;

 function empty (a,b=[])
 {if(!Array.isArray(b)) return; 
 var conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
 if(conditions.includes(a)|| (typeof a === 'string' && conditions.includes(a.toString().trim())))
 {return true;};
 return false;};`

Çözümün arkasındaki mantık, işlevin a ve b olmak üzere iki parametresi olmasıdır. , a değeridir, kontrol etmemiz gereken değer, b yukarıda listelendiği gibi önceden tanımlanmış koşullardan hariç tutmamız gereken ayarlı koşullara sahip bir dizidir. B'nin varsayılan değeri boş bir dizi [] olarak ayarlanır.

İlk çalıştırma, b'nin bir dizi olup olmadığını kontrol etmektir, değilse erken çıkın.

sonraki adım, [null,'0','0.0',false,undefined,'']b dizisinden gelen ve diziden dizi farkını hesaplamaktır . b boş bir diziyse, önceden tanımlanmış koşullar geçerli olacaktır, aksi takdirde eşleşen değerleri kaldıracaktır.

koşullar = [önceden tanımlanmış küme] - [hariç tutulacak küme] filtre işlevi tam olarak onu kullanan yapar. Artık dizi kümesinde koşullara sahip olduğumuza göre tek yapmamız gereken, değerin koşullar dizisinde olup olmadığını kontrol etmektir. include işlevi tam olarak bunu yapar, kendi kötü döngülerinizi yazmanıza gerek kalmaz, JS motoru işin zor kısmını halleder.

Yakaladım biz karşılaştırma için dizeye bir dönüştürmek istiyorsak o zaman 0 ve 0.0 ancak boş ve Tanımsız yanılma yoluyla tüm senaryoyu engelleme olurdu ince aday olacağını. Uç durum çözümüne ihtiyacımız var. Basitin altında || ilk koşul karşılanmazsa uç durumu kapsar. Başka bir erken kontrol gerçekleştirmek, karşılanmazsa erken çıkış sağlar.

if(conditions.includes(a)||  (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))

trim () işlevi daha geniş beyaz alanları ve yalnızca sekme değerini kapsayacak ve yalnızca uç durum senaryosunda devreye girecektir.

Oyun alanı

function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)|| 
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
 return true;
} 
return false;
}

console.log('1 '+empty());
console.log('2 '+empty(''));
console.log('3 '+empty('      '));
console.log('4 '+empty(0));
console.log('5 '+empty('0'));
console.log('6 '+empty(0.0));
console.log('7 '+empty('0.0'));
console.log('8 '+empty(false));
console.log('9 '+empty(null));
console.log('10 '+empty(null,[null]));
console.log('11 dont check 0 as number '+empty(0,['0']));
console.log('12 dont check 0 as string '+empty('0',['0']));
console.log('13 as number for false as value'+empty(false,[false]));

Karmaşık hale getirelim - ya karşılaştırılacak değerimiz diziyse ve olabileceği kadar derinlemesine iç içe olabilir. Ya dizideki herhangi bir değerin boş olup olmadığını kontrol edersek, bu bir uç iş durumu olabilir.

function empty (a,b=[]){
    if(!Array.isArray(b)) return;

    conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
    if(Array.isArray(a) && a.length > 0){
    for (i = 0; i < a.length; i++) { if (empty(a[i],b))return true;} 
    } 
    
    if(conditions.includes(a)|| 
    (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
     return true;
    } 
    return false;
    }

console.log('checking for all values '+empty([1,[0]]));
console.log('excluding for 0 from condition '+empty([1,[0]], ['0']));

benim çerçevemde benimsediğim basit ve daha geniş kullanım durumu işlevi;

  • Belirli bir durumda boş tanımının tam olarak ne olduğu konusunda kontrol sağlar
  • Boş koşulları yeniden tanımlamak için kontrol sağlar
  • String, number, float, truey, null, undefined ve deep dizilerden neredeyse her şeyi karşılaştırabilir
  • Çözüm, yeniden üretilebilirlik ve esneklik göz önünde bulundurularak çizilir. Diğer tüm cevaplar, basit bir veya iki durumla ilgilenilecekse uygundur. Bununla birlikte, yukarıdaki kod parçacıkları kodlanırken boş değişikliklerin tanımlanması bu durumda kusursuz bir şekilde çalıştığı her zaman bir durum vardır.

0

Özellikle boş ve boş dizeleri kontrol etmekten o kadar sıkıldım ki, şimdi genellikle bunu benim için yapmak için küçük bir işlevi yazıp çağırıyorum.

/**
 * Test if the given value equals null or the empty string.
 * 
 * @param {string} value
**/
const isEmpty = (value) => value === null || value === '';

// Test:
isEmpty('');        // true
isEmpty(null);      // true
isEmpty(1);         // false
isEmpty(0);         // false
isEmpty(undefined); // false

0

function validateAttrs(arg1, arg2, arg3,arg4){
    var args = Object.values(arguments);
    return (args.filter(x=> x===null || !x)).length<=0
}
console.log(validateAttrs('1',2, 3, 4));
console.log(validateAttrs('1',2, 3, null));
console.log(validateAttrs('1',undefined, 3, 4));
console.log(validateAttrs('1',2, '', 4));
console.log(validateAttrs('1',2, 3, null));

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.