Jak sprawdzić, czy wartość nie jest null i nie jest pustym ciągiem w JS


86

Czy istnieje kontrola, czy wartość nie jest pusta i nie jest pustym ciągiem w JavaScript? Używam następującego:

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

Ale zastanawiam się, czy jest inne lepsze rozwiązanie. Dzięki.


6
if(data)wystarczyłoby, jak napisano tutaj
CIsForCookies

1
Próbowałem tego, ale w jednym z dwóch przypadków nie działało.
ivva

dziękuję wszystkim, spróbuję tego. Mam nadzieję, że to zadziała.
ivva,

undefinedjest jednym ze specjalnych przypadków, które zgodnie z twoją logiką powinny wywołać, // do somethingale tak się nie stanie.
Salman A,

Odpowiedzi:


163

Jeśli naprawdę chcesz potwierdzić, że zmienna nie jest pusta, a konkretnie nie jest pustym ciągiem, napisz:

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

Zauważ, że zmieniłem twój kod, aby sprawdzić równość typów ( !==| ===).

Jeśli jednak chcesz się tylko upewnić, że kod będzie działał tylko dla "rozsądnych" wartości, możesz, jak powiedzieli już inni, napisać:

if (data) {
  // do something
}

Ponieważ w javascript zarówno wartości null, jak i puste łańcuchy, są równe false (tj null == false.).

Różnica między tymi dwiema częściami kodu polega na tym, że w przypadku pierwszej każda wartość, która nie jest konkretnie null lub pustym ciągiem, będzie zawierała rozszerzenie if. Jednak na drugim, każda wartość true-owski będzie wprowadzić if: false, 0, null, undefinedi pustych strun, nie.


2
0 jest rozsądną wartością w wielu przypadkach
Aequitas

3
dlatego słowo rozsądne jest owinięte cudzysłowami :)
Gershon Papi

@Adam Jeśli tak się nie stanie, możesz po prostu zostawić to puste i użyć innego. To zawsze się odwróci zgodnie z oczekiwaniami.
The Nate

Czy to nie powinny być dane! == null || data! == '' zamiast &&?
Imdad

@Imdad OP poprosił o sprawdzenie, czy wartość nie jest null ORAZ nie jest pustym ciągiem, więc nie.
Gershon Papi

18

Zarówno nullciąg znaków, jak i pusty ciąg są wartościami fałszywymi w JS. W związku z tym,

if (data) { ... }

jest całkowicie wystarczający.

Uwaga na boku: unikałbym zmiennej w moim kodzie, która mogłaby objawiać się w różnych typach. Jeśli dane ostatecznie będą ciągiem, początkowo zdefiniowałbym moją zmienną pustym ciągiem, więc możesz to zrobić:

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

bez null (lub innych dziwnych rzeczy data = "0") wchodzących w drogę.


11

Zamiast używać

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

// do something
}

Możesz użyć poniższego prostego kodu

if(Boolean(value)){ 
// do something 
}
  • Wartości, które są intuicyjnie „puste”, takie jak 0, pusty łańcuch, null, undefined i NaN, stają się fałszywe
  • Inne wartości stają się prawdziwe

6

Często testuję pod kątem prawdziwej wartości, a także pustych spacji w ciągu:

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

Jeśli masz ciąg składający się z jednej lub więcej pustych spacji, zostanie on obliczony jako prawdziwy.


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

?. opcjonalnie operatora łańcuchowym się zwarcie i powrót undefined, jeżeli dane są nullish( nulllub undefined), który FALSE w ifekspresji.


Szczerze mówiąc nie wiedziałem o tym operatorze ... niestety kilka przeglądarek na Androida go nie obsługuje, ale poza tym obsługa jest całkiem dobra!
brandonmack

2

Zarówno null, jak i empty można zweryfikować w następujący sposób:

<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

spróbuj ----------

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

Kiedy kodujemy puste w istocie, może to oznaczać jedno z poniższych, biorąc pod uwagę okoliczności;

  • 0 jak w wartości liczbowej
  • 0.0 jak w wartości zmiennoprzecinkowej
  • „0” jak w wartości ciągu
  • „0.0” jak w wartości ciągu
  • null jak w wartości Null, ponieważ przypadkowo może również przechwycić undefined lub nie
  • undefined jako wartość undefined
  • fałszywe jako fałszywe prawdziwe wartości, na przypadek 0 również jako prawdziwe, ale co, jeśli chcemy uchwycić fałszywe takie, jakie są
  • „” pusta wartość żądań bez spacji i tabulacji
  • „” tylko ze spacją lub tabulatorem

W rzeczywistej sytuacji, jak stwierdził OP, możemy chcieć przetestować je wszystkie lub czasami możemy chcieć przetestować tylko dla ograniczonego zestawu warunków.

Generalnie if(!a){return true;}spełnia swoje zadanie przez większość czasu, jednak nie obejmuje szerszego zestawu warunków.

Kolejny hack, który się pojawił, to return (!value || value == undefined || value == "" || value.length == 0);

Ale co, jeśli potrzebujemy kontroli nad całym procesem?

Nie ma prostego rozwiązania whiplash w natywnym rdzeniu JavaScript, które musi zostać przyjęte. Biorąc pod uwagę, że porzucamy wsparcie dla starszej wersji IE11 (szczerze mówiąc, nawet Windows tak powinno być), poniżej rozwiązanie zrodzone z frustracji działa we wszystkich nowoczesnych przeglądarkach;

 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;};`

Logika rozwiązania polega na tym, że funkcja ma dwa parametry a i b , a to wartość, którą musimy sprawdzić, b to tablica z ustawionymi warunkami, które musimy wykluczyć ze wstępnie zdefiniowanych warunków, jak podano powyżej. Domyślna wartość b jest ustawiona na pustą tablicę [].

Pierwszym uruchomieniem funkcji jest sprawdzenie, czy b jest tablicą, czy nie, a jeśli nie, to wcześniejsze wyjście z funkcji.

następnym krokiem jest obliczenie różnicy w tablicy z [null,'0','0.0',false,undefined,'']i z tablicy b. jeśli b jest pustą tablicą, predefiniowane warunki będą obowiązywać, w przeciwnym razie usunie pasujące wartości.

warunki = [zestaw predefiniowany] - [zestaw wykluczony] funkcja filtru robi dokładnie to, co z niej korzysta. Teraz, gdy mamy warunki w tablicy, wszystko, co musimy zrobić, to sprawdzić, czy wartość jest w tablicy warunków. include function robi dokładnie to, czego nie trzeba pisać własnych paskudnych pętli, niech silnik JS wykona ciężkie prace.

Rozumiem, jeśli mamy przekonwertować ciąg znaków w celu porównania, 0 i 0,0 działałyby dobrze, jednak Null i Undefined mogłyby spowodować błąd blokujący cały skrypt. Potrzebujemy rozwiązania na skrajne przypadki. Poniżej proste || obejmuje skrajny przypadek, jeśli pierwszy warunek nie jest spełniony. Uruchomienie kolejnego wczesnego sprawdzania obejmuje wcześniejsze wyjście, jeśli nie zostanie spełnione.

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

Funkcja trim () obejmie tylko wartość szerszych odstępów i tabulatorów i będzie działać tylko w scenariuszu skrajnym.

Plac zabaw

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]));

Zróbmy to bardziej złożonym - co, jeśli nasza wartość do porównania jest tablicą i może być tak głęboko zagnieżdżona, jak to tylko możliwe. co, jeśli mamy sprawdzić, czy jakakolwiek wartość w tablicy jest pusta, może to być skrajny przypadek biznesowy.

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']));

jest to prosta i szersza funkcja przypadku użycia, którą przyjęłam w swoim programie;

  • Daje kontrolę nad tym, czym dokładnie jest definicja pustego w danej sytuacji
  • Daje kontrolę nad przedefiniowaniem warunków pustego
  • Może porównywać prawie każdą rzecz, od ciągów, liczb, zmiennoprzecinkowych, prawdziwych, zerowych, nieokreślonych i głębokich tablic
  • Rozwiązanie zostało opracowane z uwzględnieniem odnawialności i elastyczności. Wszystkie inne odpowiedzi są odpowiednie na wypadek, gdyby trzeba było zająć się jednym lub dwoma prostymi przypadkami. Jednak zawsze zdarza się, że definicja pustych zmian podczas kodowania powyżej fragmentów kodu działa w tym przypadku bezbłędnie.

0

Miałem już dość sprawdzania, czy w szczególności nie ma ciągów zerowych i pustych, że teraz zwykle po prostu piszę i wywołuję małą funkcję, która robi to za mnie.

/**
 * 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));

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.