Jak sprawdzić wartości zerowe w JavaScript?


573

Jak mogę sprawdzić wartości zerowe w JavaScript? Napisałem poniższy kod, ale nie działał.

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

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

}   

Jak mogę znaleźć błędy w moich programach JavaScript?


Czy na pewno testowane wartości są w rzeczywistości zerowe, a nie tylko pusty ciąg?
Jan-Peter Vos

72
testowanie nullw js powinno być wykonane przy użyciu ścisłego operatora===
davin

3
@davin - prawda, ale nie problem tutaj, ponieważ gdyby tak było, instrukcja nadal by działała.
Mark Kahn

3
@cwolves, gdybym pomyślał, że to problem, uczyniłbym ten komentarz odpowiedzią. Sprawdź moje sformułowanie, wyraźnie wypowiadam się na temat języka w odniesieniu do praktyki PO i nie sugeruję, że to rozwiąże jego problem.
David

2
@TRiG proponowane zmiany zasadniczo zmieniają charakter pytania do tego stopnia, że ​​odpowiedzi (nie tylko moje) tracą kontekst i nie mają sensu. Edycja powinna być tylko komentarzem.
ic3b3rg

Odpowiedzi:


741

JavaScript jest bardzo elastyczny w zakresie sprawdzania wartości „zerowych”. Zgaduję, że faktycznie szukasz pustych ciągów, w takim przypadku ten prostszy kod będzie działał:

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

Który sprawdzi pustych strunach ( ""), null, undefined, falseoraz numery 0iNaN

Należy pamiętać, że jeśli konkretnie sprawdza się liczby, często pomija się 0tę metodę i num !== 0jest preferowane ( num !== -1lub ~num(hacky kod, który sprawdza również -1)) dla funkcji, które zwracają -1, np. indexOf)


4
Byłoby bardzo przydatne wiedzieć, które części tego testu dla których wartości. Czasami szukasz konkretnej.
inorganik

2
Trochę spóźnione oświadczenie, ale tak, możesz wykonać test na każdym z nich @inorganik, zobacz moją odpowiedź poniżej
WebWanderer

28
Czytelnicy, należy zachować ostrożność podczas korzystania z tego typu testu danych liczbowych. Nie używaj !ani !!do testowania danych typowo numerycznych nullani undefinedna nich, chyba że chcesz również wyrzucić wartości 0.
NickS

4
Sama odpowiedź brzmi: „... i liczby 0...”. Uważam, że ta odpowiedź jest całkowicie odpowiednia dla pytania, ponieważ biorąc pod uwagę kontekst (który rozumiem to „nazwa użytkownika, hasło, adres e-mail”), nie sprawdzają 0wartości. Biorąc jednak pod uwagę popularność tego pytania i odpowiedzi, zgadzam się, że warto wspomnieć w samej odpowiedzi.
Mark Kahn

4
@Hendeca - przewraca oczami Idź przeczytaj kod w aktualnym pytaniu. To wyraźnie pyta o nazw użytkowników i haseł. Nic nie zgaduję, byłem po prostu uprzejmy. Niepokoi Cię fakt, że odpowiedziałem na to, czego potrzebowali, a nie na to, o co prosili, co jest absurdalne. To jest TAK, w większości przypadków ludzie nie wiedzą, o co powinni prosić. W kontekście pierwotnego pytania odpowiedź jest poprawna. Teraz przestań dodawać hałas.
Mark Kahn

418

Aby sprawdzić, czy nie ma wartości SZCZEGÓŁOWE , użyłbyś tego:

if (variable === null)

Ten test będzie tylko udawać nulli nie przejdzie do "", undefined, false, 0, lub NaN.

Dodatkowo podałem bezwzględne kontrole dla każdej „fałszywej” wartości (tej, która zwróciłaby wartość true !variable).

Uwaga: w przypadku niektórych kontroli bezwzględnych konieczne będzie wdrożenie funkcji absolutely equals: ===i typeof.

Utworzyłem JSFiddle tutaj aby pokazać wszystkie z poszczególnych testów pracy

Oto wynik każdej kontroli:

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

Jak widać, testowanie przeciwko jest nieco trudniejsze NaN;


9
Jaki jest cel sprawdzania typu, jeśli używasz ===ścisłej równości? Dzięki. Również dla testu NaN możesz użyć isNaN(value), który zwróci truetylko wtedy, gdy zmienna jest równa NaN.
Michael Malinovskij

16
Czy istnieje przypadek, w którym variable === nullnie ma typu „obiekt”? Jeśli nie, dlaczego nie uprościć czeku variable === null, wyrzucając drugi koniunkturę? Dzięki.
Hunan Rostomyan

7
@HunanRostomyan Dobre pytanie, i szczerze mówiąc, nie, nie sądzę, że tak. Najprawdopodobniej jesteś wystarczająco bezpieczny, używając tego, variable === nullco właśnie przetestowałem tutaj w tym JSFiddle . Powodem, dla którego użyłem również obiektu „&& typeof zmienna ===”, było nie tylko zilustrowanie interesującego faktu, że nullwartość jest typem object, ale także zachowanie ciągłości innych kontroli. Ale tak, podsumowując, jesteś bezpieczny w użyciu po prostu variable === null.
WebWanderer

1
jsfiddle.net/neoaptt/avt1cgem/1 Oto odpowiedź podzielona na funkcje. Niezbyt przydatne, ale i tak to zrobiłem.
Neoaptt,

1
Zrobię coś, co prawie nigdy nie jest dobrym pomysłem: zmień kod w tej odpowiedzi. W szczególności usuń całkowicie niepotrzebny test na obiekt typu, sprawdzając, czy jest pusty. Jest to podstawowy fragment kodu: nie jest dobrym pomysłem, aby choćby jeden początkujący źle się nauczył, że musi wykonać pełny test.
ToolmakerSteve,

59

po prostu wymienić ==się ===we wszystkich miejscach.

== to luźne lub abstrakcyjne porównanie równości

=== jest ścisłym porównaniem równości

Aby uzyskać więcej informacji, zobacz artykuł MDN na temat porównań i identyczności równości .


2
Działa to tylko wtedy, gdy uważasz, że undefinedtak nie jest null. W przeciwnym razie spowoduje to wiele nieoczekiwanych zachowań. Zasadniczo, jeśli interesują Cię obie null/ undefinednie wartości fałszowania, użyj ==(jednego z niewielu przypadków, kiedy powinieneś to zrobić).
Andrew Mao,

2
@AndrewMao undefined nie jest null : stackoverflow.com/a/5076962/753237
ic3b3rg

2
Uważam, że tak właśnie powiedział @AndrewMao. Jego pierwsze zdanie może zostać przepisane „Działa to tylko w sytuacjach, w których niezdefiniowane i zerowe nie są praktycznymi odpowiednikami”.
BobRodes

1
@BobRodes Dziękuję za wyjaśnienie mojego słabego pisania, doceniam to :)
Andrew Mao

@AndrewMao Nie ma za co. I osobiście nie nazwałbym twojego pisania pismem; Powiedziałbym, że jest o wiele lepszy niż średnia. :)
BobRodes

30

Operator ścisłej równości:

Możemy sprawdzić wartość null przez ===

if ( value === null ){

}

Tylko za pomocą if

if( value ) {

}

oceni prawdę, jeśli wartość nie jest :

  • zero
  • nieokreślony
  • NaN
  • pusta struna ("")
  • fałszywe
  • 0

9

Ulepszenie w stosunku do zaakceptowanej odpowiedzi poprzez jawne sprawdzenie, nullale z uproszczoną składnią:

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

Po pierwsze, masz instrukcję return bez treści funkcji. Są szanse, że spowoduje to błąd.

Bardziej czystym sposobem na sprawdzenie byłoby po prostu użycie! operator:

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

    alert("fill all columns");

}

12
Ten kod prawdopodobnie działa, po prostu go nie pokazał;)
Mark Kahn

4

możesz wreszcie spróbować złapać

 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 {}   

możesz także throwwłasne błędy. Zobacz to .


1
myślę, że to kwalifikuje się jako kod „paranoiczny”. jeśli naprawdę napisałeś coś takiego, zrozumiałbyś, że „mydiv” nie mógłby istnieć. nie powinniśmy dotrzeć do tego kodu, chyba że jesteśmy pewni, że tak jest, i mielibyśmy wiele możliwości, takich jak kody odpowiedzi, aby upewnić się, że jesteśmy pewni, zanim spróbujemy takiej linii.
calql8edkos

Nie używaj try-catch do kontroli. To nie jest dobre rozwiązanie.
Andrew S

4

W JavaScript żaden ciąg znaków nie jest równy null.

Być może spodziewałeś się, że pass == nullto prawda, gdy passpusty ciąg znaków, ponieważ masz świadomość, że operator luźnej równości ==dokonuje pewnego rodzaju przymusu typu.

Na przykład to wyrażenie jest prawdziwe:

'' == 0

Natomiast operator ścisłej równości ===mówi, że jest to fałsz:

'' === 0

Biorąc to pod uwagę ''i 0są luźno równe, możesz rozsądnie przypuszczać, że ''i nullsą luźno równe. Jednak nie są.

To wyrażenie jest fałszywe:

'' == null

Wynik porównania dowolnego ciągu znaków nulljest fałszywy. Dlatego pass == nullwszystkie pozostałe testy są zawsze fałszywe, a użytkownik nigdy nie otrzymuje ostrzeżenia.

Aby naprawić kod, porównaj każdą wartość z pustym ciągiem:

pass === ''

Jeśli masz pewność, że passjest to ciąg, pass == ''zadziała również, ponieważ tylko pusty ciąg jest luźno równy pustemu ciągowi. Z drugiej strony niektórzy eksperci twierdzą, że dobrą praktyką jest zawsze stosowanie ścisłej równości w JavaScript, chyba że specjalnie chcesz zastosować przymus typu, który wykonuje operator luźnej równości.

Jeśli chcesz wiedzieć, które pary wartości są luźno równe, zobacz tabelę „Porównania podobieństwa” w artykule Mozilli na ten temat .


4

aby sprawdzić, czy w javascript jest niezdefiniowana i pusta , wystarczy napisać:

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

6
! var ma również wartość true dla 0, „”, NaN i false.
Matt

3

To jest komentarz dotyczący rozwiązania WebWanderer dotyczącego sprawdzania NaN (nie mam jeszcze wystarczającej liczby przedstawicieli, aby zostawić formalny komentarz). Rozwiązanie brzmi jak

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

ale to się nie powiedzie w przypadku liczb wymiernych, które zaokrągliby do 0, takich jak variable = 0.1. Lepszym testem byłoby:

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

1
Dzięki za zwrócenie uwagi na błąd Gabriela, umieściłem poprawkę w mojej odpowiedzi. Poza tym mogłem naprawić test, zmieniając parseIntna parseFloat (co powinno być dla mnie oczywiste w pierwszej kolejności). Unikałem używania tej isNanfunkcji, ponieważ wydaje mi się, że wielu programistów postrzega takie funkcje, jak isNaNpewnego rodzaju „magiczne pudełko”, w które wchodzą wartości i wychodzą z nich booleany, i chciałem przetestować nieco bardziej szczegółowo. Ale tak, sugerowany test będzie działał i jest całkowicie w porządku. Przykro mi, ale do tej pory nie zauważyłem twojego wpisu.
WebWanderer 16.04.15

1
Świetnie, wydaje się, że działa. Dzięki za komentarz na temat, dlaczego unika isNaNjak dobrze, mogę dostać za tą logiką. Istnieje również metoda Underscore.js, która wydaje się jeszcze bardziej zagmatwana / blackbox, ale i tak warto ją zauważyć, ponieważ korzysta z niej NaN !== NaN. Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
Gabriel

2

Właściwie myślę, że możesz potrzebować użyć, if (value !== null || value !== undefined) ponieważ jeśli użyjesz if (value), możesz również odfiltrować 0 lub fałszywe wartości.

Rozważ te dwie funkcje:

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

W mojej sytuacji, po prostu potrzebne, aby sprawdzić, czy wartość jest null i niezdefiniowana i nie chcę aby filtrować 0albo falseczy ''wartości. więc użyłem drugiego testu, ale może być konieczne ich też odfiltrowanie, co może spowodować, że użyjesz pierwszego testu.


1

Znalazłem inny sposób na sprawdzenie, czy wartość jest pusta:

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

nullDziała jak numberi objectw tym samym czasie. Porównywanie null >= 0lub null <= 0wyniki w true. Porównując null === 0lub null > 0czy null < 0spowoduje fałszywy. Ale podobnie jak nullobiekt możemy go wykryć jako zerowy.

Zrobiłem bardziej złożoną funkcję, że czarownica poradzi sobie lepiej niż typeof i można powiedzieć, jakie typy należy uwzględnić lub zachować w grupie

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

Zrobiłem tę bardzo prostą funkcję, która działa cuda:

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

Trasa to dowolny łańcuch wartości, który może wybuchnąć. Używam go do jQuery / cheerio i obiektów i tym podobnych.

Przykłady 1: obiekt prosty, jak to const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};.

Ale może to być bardzo duży przedmiot, którego nawet nie stworzyliśmy. Więc przekazuję to przez:

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

Oczywiście jeśli wolisz, możesz użyć nullalbo 'No value'... Niezależnie od własnych potrzeb.

Zwykle zapytanie DOM lub selektor jQuery może zgłosić błąd, jeśli nie zostanie znaleziony. Ale używając czegoś takiego:

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

1

Możesz użyć modułu lodash, aby sprawdzić, czy wartość jest pusta lub niezdefiniowana

_.isNil(value)
Example 

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

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

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

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

LINK: https://lodash.com/docs/#isNil


0

To nie zadziała w przypadku wartości logicznych pochodzących z DB np.

 value = false

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

0

AFAIK w JAVASCRIPT, gdy zmienna jest zadeklarowana, ale nie ma przypisanej wartości, jej typ to undefined. więc możemy sprawdzić zmienną, nawet jeśli byłaby to instancjaobject trzymająca miejsce zamiast wartości .

utwórz metodę pomocniczą do sprawdzania zwracanej wartości null truei użyj jej w interfejsie API.

funkcja pomocnicza, aby sprawdzić, czy zmienna jest pusta:

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

try-catch wyjątkowe wywołanie API:

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

niektóre przypadki testowe:

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
Co? Ta odpowiedź nie ma nic wspólnego z tym postem. Czy opublikowałeś tę odpowiedź przez przypadek?
WebWanderer

Ta isEmptyfunkcja działa dokładnie tak samo !. Nie trzeba wymyślać funkcji. Po prostu zrób if (!pass || !cpass || !email ...). (Które jest już pokazane w zaakceptowanej odpowiedzi.) I na komentarz WebWanderer, środkowa część tego postu, „spróbuj złapać wyjątkowe wywołanie API”, wydaje się nie mieć związku z tym pytaniem. Proszę wyjaśnić swoje zamiary - kiedy to jest przydatne? Jak to się ma do pytania?
ToolmakerSteve,

0

Sprawdzanie warunków błędu:

// 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");
}

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.