Ö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.
if(data)burada