Wie suche ich in JavaScript nach Nullwerten?


573

Wie kann ich in JavaScript nach Nullwerten suchen? Ich habe den folgenden Code geschrieben, aber er hat nicht funktioniert.

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

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

}   

Und wie finde ich Fehler in meinen JavaScript-Programmen?


Sind Sie sicher, dass die Werte, die Sie testen, tatsächlich null und nicht nur eine leere Zeichenfolge sind?
Jan-Peter Vos

72
Tests nullin js sollten mit dem strengen Operator durchgeführt werden===
David

3
@davin - wahr, aber nicht das Problem hier, denn wenn es so wäre, würde die Anweisung immer noch funktionieren.
Mark Kahn

3
@wölfe, wenn ich gedacht hätte, es wäre das Problem, hätte ich diesen Kommentar zu einer Antwort gemacht. Schauen Sie sich meinen Wortlaut an, ich mache eine allgemeine Aussage über die Sprache in Bezug auf die Praxis des OP und schlage nicht vor, dass dies sein Problem löst.
David

2
@TRiG Die vorgeschlagenen Änderungen verändern die Art der Frage grundlegend bis zu dem Punkt, an dem die Antworten (nicht nur meine) den Kontext verlieren und keinen Sinn mehr ergeben. Die Bearbeitung sollte nur ein Kommentar sein.
ic3b3rg

Antworten:


741

Javascript ist sehr flexibel in Bezug auf die Überprüfung auf "Null" -Werte. Ich vermute, Sie suchen tatsächlich nach leeren Zeichenfolgen. In diesem Fall funktioniert dieser einfachere Code:

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

Welche für leere Strings (wird überprüft ""), null, undefined, falseund die Zahlen 0undNaN

Bitte beachten Sie, dass , wenn Sie speziell für die Zahlen überprüfen es ein häufiger Fehler zu verpassen ist 0bei dieser Methode, und num !== 0bevorzugt (oder num !== -1oder ~num(Hacky - Code, der auch Kontrollen gegen -1)) für Funktionen , die Rückkehr -1, zum Beispiel indexOf)


4
Es wäre sehr nützlich zu wissen, welche Teile dieses Tests für welche Werte gelten. Manchmal suchen Sie einen bestimmten.
anorganik

2
Etwas verspätete Aussage, aber ja, Sie können einen Test gegen jeden @inorganik durchführen, siehe meine Antwort unten
WebWanderer

28
Leser, bitte seien Sie vorsichtig, wenn Sie diese Art von Test für numerische Daten verwenden. Verwenden !oder !!testen Sie nicht für nulloder undefinedauf typisch numerischen Daten, es sei denn, Sie möchten auch Werte von 0
wegwerfen

4
Die Antwort selbst lautet: "... und die Zahlen 0...". Ich glaube, diese Antwort ist perfekt für die Frage geeignet, da sie angesichts des Kontexts (den ich als "Benutzername, Passwort, E-Mail" bezeichne) nicht nach 0Werten sucht. Angesichts der Beliebtheit dieser Frage und Antwort stimme ich jedoch zu, dass es wert ist, in der Antwort selbst erwähnt zu werden.
Mark Kahn

4
@Hendeca - rollt mit den Augen Lesen Sie den Code in der eigentlichen Frage. Es wird eindeutig nach Benutzernamen und Passwörtern gefragt. Ich rate nichts, ich war nur höflich. Es stört Sie, dass ich geantwortet habe, was sie brauchten und nicht, was sie gefragt haben, was absurd ist. Dies ist SO, die meisten Leute wissen nicht, wonach sie fragen sollen. Im Kontext der ursprünglichen Frage ist diese Antwort richtig. Hören Sie jetzt auf, Rauschen hinzuzufügen.
Mark Kahn

418

Um SPEZIFISCH auf Null zu prüfen , würden Sie Folgendes verwenden:

if (variable === null)

Dieser Test wird nur für passieren nullund vergehen nicht "", undefined, false, 0, oder NaN.

Zusätzlich habe ich absolute Überprüfungen für jeden "falsch-ähnlichen" Wert bereitgestellt (einer, für den true zurückgegeben wird !variable).

Beachten Sie, dass Sie für einige der absoluten Prüfungen die Verwendung von absolutely equals: ===und implementieren müssen typeof.

Ich habe hier eine JSFiddle erstellt , um zu zeigen, dass alle einzelnen Tests funktionieren

Hier ist die Ausgabe jeder Prüfung:

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

Wie Sie sehen können, ist es etwas schwieriger, dagegen zu testen NaN.


9
Was ist der Zweck der Typprüfung, wenn Sie ===strikte Gleichheit verwenden? Vielen Dank. Auch für den NaN-Test können Sie diesen verwenden isNaN(value), der truenur zurückgibt, wenn die Variable gleich NaN ist.
Michael Malinovskij

16
Gibt es einen Fall, in dem variable === nullder Typ "Objekt" aber nicht vom Typ ist? Wenn dies nicht der Fall ist, vereinfachen Sie die Überprüfung variable === null, indem Sie die zweite Konjunktion wegwerfen. Vielen Dank.
Hunan Rostomyan

7
@HunanRostomyan Gute Frage, und ehrlich gesagt, nein, ich glaube nicht, dass es gibt. Sie sind höchstwahrscheinlich sicher genug, variable === nullwas ich gerade hier in dieser JSFiddle getestet habe . Der Grund, warum ich auch "&& typeof variable ===" object "" verwendet habe, war nicht nur, um die interessante Tatsache zu veranschaulichen, dass ein nullWert ein typeof ist object, sondern auch, um mit dem Fluss der anderen Prüfungen Schritt zu halten. Aber ja, abschließend können Sie sicher einfach verwenden variable === null.
WebWanderer

1
jsfiddle.net/neoaptt/avt1cgem/1 Hier ist diese Antwort in Funktionen unterteilt. Nicht sehr nützlich, aber ich habe es trotzdem getan.
Neoaptt

1
Ich werde etwas tun, das fast nie eine gute Idee ist: Ändern Sie den Code in dieser Antwort. Entfernen Sie insbesondere den völlig unnötigen Test für das Typobjekt, wenn Sie nach null suchen. Dies ist ein grundlegender Code-Ausschnitt: Es ist keine gute Idee, auch nur einen Anfänger falsch zu lernen, dass er diesen ausführlichen Test durchführen muss.
ToolmakerSteve

59

ersetzen Sie einfach die ==mit ===in allen Orten.

== ist ein loser oder abstrakter Gleichheitsvergleich

=== ist ein strenger Gleichheitsvergleich

Weitere Informationen finden Sie im MDN-Artikel zu Gleichstellungsvergleichen und Gleichheit .


2
Dies funktioniert nur, wenn Sie undefineddies nicht in Betracht ziehen null. Andernfalls kommt es zu vielen unerwarteten Verhaltensweisen. Wenn Sie an beiden null/ undefinedaber nicht an falschen Werten interessiert sind, verwenden Sie im Allgemeinen ==(einer der wenigen Fälle, in denen Sie dies tun sollten).
Andrew Mao

2
@ AndrewMao undefined ist nicht null : stackoverflow.com/a/5076962/753237
ic3b3rg

2
Ich glaube, das hat @AndrewMao wirklich gesagt. Sein erster Satz könnte umgeschrieben werden: "Dies funktioniert nur in Situationen, in denen undefiniert und null keine praktischen Äquivalente sind."
BobRodes

1
@ BobRodes Danke für die Klärung meines schlechten Schreibens, ich schätze es :)
Andrew Mao

@ AndrewMao Gern geschehen. Und ich würde Ihr Schreiben nicht persönlich als schlecht bezeichnen. Ich würde sagen, es ist viel besser als der Durchschnitt. :)
BobRodes

30

Strenger Gleichheitsoperator: -

Wir können null durch überprüfen ===

if ( value === null ){

}

Nur mit if

if( value ) {

}

wird als wahr ausgewertet, wenn der Wert nicht ist :

  • Null
  • nicht definiert
  • NaN
  • leerer String ("")
  • falsch
  • 0

9

Verbesserung gegenüber der akzeptierten Antwort durch explizite Überprüfung, nulljedoch mit vereinfachter Syntax:

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

Erstens haben Sie eine return-Anweisung ohne Funktionskörper. Es besteht die Möglichkeit, dass dies einen Fehler auslöst.

Eine sauberere Möglichkeit, Ihre Prüfung durchzuführen, wäre die Verwendung der! Operator:

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

    alert("fill all columns");

}

12
Dieser Code ist wahrscheinlich in einer Funktion, er hat ihn einfach nicht gezeigt;)
Mark Kahn

4

Sie können try catch endlich verwenden

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

Sie können auch throwIhre eigenen Fehler machen. Sehen Sie das .


1
Ich denke, dies qualifiziert sich als "paranoider" Code. Wenn Sie so etwas wirklich schreiben würden, wäre es mit dem Verständnis, dass "mydiv" unmöglich nicht existieren könnte. Wir sollten diesen Code nur erreichen, wenn wir sicher sind, dass dies der Fall ist, und wir hätten viele Möglichkeiten, wie z. B. Antwortcodes, um sicherzustellen, dass wir sicher sind, bevor wir eine solche Zeile versuchen.
Calql8edkos

Verwenden Sie nicht try and catch für den Kontrollfluss. Dies ist keine gute Lösung.
Andrew S

4

In JavaScript ist keine Zeichenfolge gleich null.

Vielleicht haben Sie erwartet pass == null, dass es wahr ist, wenn passes sich um eine leere Zeichenfolge handelt, weil Sie wissen, dass der Operator für lose Gleichheit ==bestimmte Arten von Typenzwang ausführt.

Zum Beispiel ist dieser Ausdruck wahr:

'' == 0

Im Gegensatz dazu ===sagt der strenge Gleichheitsoperator , dass dies falsch ist:

'' === 0

Wenn man das bedenkt ''und 0lose gleich ist, könnte man das vernünftigerweise vermuten ''und nullist locker gleich. Dies ist jedoch nicht der Fall.

Dieser Ausdruck ist falsch:

'' == null

Das Ergebnis des Vergleichs einer Zeichenfolge mit nullist falsch. Daher sind pass == nullalle Ihre anderen Tests immer falsch, und der Benutzer erhält nie die Warnung.

Vergleichen Sie jeden Wert mit der leeren Zeichenfolge, um Ihren Code zu korrigieren:

pass === ''

Wenn Sie sicher sind, dass passes sich um eine Zeichenfolge handelt, pass == ''funktioniert dies auch, da nur eine leere Zeichenfolge der leeren Zeichenfolge entspricht. Auf der anderen Seite sagen einige Experten, dass es eine gute Praxis ist, in JavaScript immer strikte Gleichheit zu verwenden, es sei denn, Sie möchten speziell den Typzwang ausführen, den der Operator für lose Gleichheit ausführt.

Wenn Sie wissen möchten, welche Wertepaare lose gleich sind, lesen Sie die Tabelle "Sameness-Vergleiche" im Mozilla-Artikel zu diesem Thema .


4

Um in Javascript nach undefiniert und null zu suchen, müssen Sie nur Folgendes schreiben:

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

6
! var ist wahr mit 0, "", NaN und auch falsch.
Matt

3

Dies ist ein Kommentar zu WebWanderers Lösung zur Überprüfung auf NaN (ich habe noch nicht genügend Mitarbeiter, um einen formellen Kommentar zu hinterlassen). Die Lösung lautet wie folgt

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

aber dies wird für rationale Zahlen scheitern, die sich runden würden 0, wie z variable = 0.1. Ein besserer Test wäre:

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

1
Vielen Dank, dass Sie auf den Fehler Gabriel hingewiesen haben. Ich habe das Problem behoben. Abgesehen davon konnte ich den Test durch einen Wechsel parseIntzu parseFloat (was für mich eigentlich offensichtlich gewesen sein sollte) reparieren . Ich habe die Verwendung der isNanFunktion vermieden, weil ich das Gefühl habe, dass viele Entwickler Funktionen wie isNaNeine Art "Magic Box" anzeigen, in die Werte eingehen und aus denen Boolesche Werte hervorgehen, und ich wollte den Test etwas ausführlicher durchführen. Aber ja, Ihr vorgeschlagener Test wird funktionieren und ist vollkommen in Ordnung zu verwenden. Entschuldigung, ich habe Ihren Beitrag bis jetzt nicht bemerkt.
WebWanderer

1
Großartig, das scheint zu funktionieren. Vielen Dank für den Kommentar, warum Sie auch vermieden haben isNaN, ich kann hinter diese Logik kommen. Es gibt auch die Underscore.js-Methode, die noch verwirrender erscheint / Blackbox, aber trotzdem erwähnenswert, weil sie ausnutzt NaN !== NaN. Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
Gabriel

2

Eigentlich denke ich, dass Sie möglicherweise verwenden müssen, if (value !== null || value !== undefined) weil Sie bei Verwendung if (value)auch 0 oder falsche Werte filtern können.

Betrachten Sie diese beiden Funktionen:

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

In meiner Situation musste ich nur überprüfen, ob der Wert null und undefiniert ist und ich wollte nicht filtern 0oder falseoder ''Werte. Daher habe ich den zweiten Test verwendet, aber möglicherweise müssen Sie sie auch filtern, was dazu führen kann, dass Sie den ersten Test verwenden.


1

Ich habe einen anderen Weg gefunden, um zu testen, ob der Wert null ist:

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

nullwirkt als numberund objectgleichzeitig. Vergleichen null >= 0oder null <= 0Ergebnisse in true. Ein Vergleich null === 0oder null > 0oder null < 0führt zu false. Da nulles sich aber auch um ein Objekt handelt, können wir es als Null erkennen.

Ich habe eine komplexere Funktion entwickelt , die besser funktioniert als die Art der Hexe und kann sagen, welche Typen eingeschlossen oder gruppiert werden sollen

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

Ich habe diese sehr einfache Funktion gemacht, die Wunder wirkt:

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

Die Route ist jede Wertekette, die explodieren kann. Ich benutze es für jQuery / Cheerio und Objekte und so.

Beispiele 1: Ein einfaches Objekt wie dieses const testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};.

Aber es könnte ein sehr großes Objekt sein, das wir noch nicht einmal gemacht haben. Also gebe ich es durch:

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

Natürlich, wenn Sie es vorziehen, können Sie verwenden nulloder 'No value'... Was auch immer Ihren Bedürfnissen entspricht.

Normalerweise kann eine DOM-Abfrage oder ein jQuery-Selektor einen Fehler auslösen, wenn er nicht gefunden wird. Aber mit so etwas wie:

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

1

Sie können das lodash-Modul verwenden, um zu überprüfen, ob der Wert null oder undefiniert ist

_.isNil(value)
Example 

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

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

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

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

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


0

Dies funktioniert nicht, wenn boolesche Werte aus der Datenbank stammen, z.

 value = false

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

0

AFAIK in JAVASCRIPT Wenn eine Variable deklariert ist , aber keinen Wert zugewiesen hat, ist ihr Typ undefined. so können wir Variablen überprüfen , auch wenn es wäre eine objectgewisse Halt Instanz anstelle von Wert .

Erstellen Sie eine Hilfsmethode zum Überprüfen der zurückgegebenen Nullheit trueund verwenden Sie sie in Ihrer API.

Hilfsfunktion zum Überprüfen, ob die Variable leer ist:

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

Try-Catch-API-Aufruf:

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

Einige Testfälle:

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
Was? Diese Antwort hat nichts mit diesem Beitrag zu tun. Hast du diese Antwort versehentlich in diesem Thread gepostet?
WebWanderer

Diese isEmptyFunktion verhält sich genau so !. Keine Notwendigkeit, eine Funktion zu erfinden. Mach einfachif (!pass || !cpass || !email ...) . (Was bereits in der akzeptierten Antwort gezeigt wird.) Und gemäß dem Kommentar von WebWanderer scheint der mittlere Teil dieses Beitrags, "Try-Catch-API-Aufruf", für diese Frage nicht relevant zu sein. Bitte erläutern Sie Ihre Absicht - wann ist das sinnvoll? Wie hängt das mit der Frage zusammen?
ToolmakerSteve

0

Überprüfen der Fehlerbedingungen:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.