Wenn wir im Wesentlichen leer codieren, kann dies unter den gegebenen Umständen eine der folgenden Bedeutungen haben:
- 0 wie im Zahlenwert
- 0,0 wie im Float-Wert
- '0' wie im Stringwert
- '0.0' wie im Stringwert
- null wie im Nullwert, zufällig könnte es auch undefiniert erfassen oder nicht
- undefiniert wie im undefinierten Wert
- falsch wie im falschen Wahrheitswert, nach Zufall 0 auch als wahr, aber was ist, wenn wir falsch so erfassen wollen, wie es ist?
- '' leerer Stichwert ohne Leerzeichen oder Tabulator
- '' Zeichenfolge nur mit Leerzeichen oder Tabulator
In der realen Situation, wie OP angegeben hat, möchten wir sie möglicherweise alle testen oder manchmal möchten wir nur auf begrenzte Bedingungen testen.
Im Allgemeinen if(!a){return true;}erfüllt es seinen Zweck die meiste Zeit, deckt jedoch keine breiteren Bedingungen ab.
Ein weiterer Hack, der seine Runde gemacht hat, ist return (!value || value == undefined || value == "" || value.length == 0);
Aber was ist, wenn wir die Kontrolle über den gesamten Prozess brauchen?
Es gibt keine einfache Schleudertrauma-Lösung in nativem JavaScript, die übernommen werden muss. In Anbetracht der Tatsache, dass wir die Unterstützung für Legacy-IE11 einstellen (um ehrlich zu sein, sollte dies auch Windows tun), funktioniert die aus Frustration entstandene Lösung in allen modernen Browsern.
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;};`
Die Logik hinter der Lösung ist, dass die Funktion zwei Parameter a und b hat hat. A ist der Wert, den wir überprüfen müssen. B ist ein Array mit festgelegten Bedingungen, die wir von den oben aufgeführten vordefinierten Bedingungen ausschließen müssen. Der Standardwert von b wird auf ein leeres Array [] gesetzt.
Der erste Funktionslauf besteht darin, zu überprüfen, ob b ein Array ist oder nicht. Wenn nicht, beenden Sie die Funktion vorzeitig.
Der nächste Schritt besteht darin, die Array-Differenz von [null,'0','0.0',false,undefined,'']und zu Array b zu berechnen . Wenn b ein leeres Array ist, bleiben vordefinierte Bedingungen bestehen, andernfalls werden übereinstimmende Werte entfernt.
Bedingungen = [vordefinierte Menge] - Die Filterfunktion [auszuschließende Menge]
macht genau das, was sie nutzt. Nachdem wir die Bedingungen im Array festgelegt haben, müssen wir nur noch prüfen, ob sich der Wert im Bedingungsarray befindet.
Includes- Funktion macht genau das, ohne dass Sie böse Schleifen selbst schreiben müssen. Lassen Sie die JS-Engine das schwere Heben erledigen.
Gotcha,
wenn wir einen zum Vergleich in einen String konvertieren wollen, würden 0 und 0.0 gut laufen, aber Null und Undefined würden durch Fehler das gesamte Skript blockieren. Wir brauchen eine Edge-Case-Lösung. Unten einfach || deckt den Randfall ab, wenn die erste Bedingung nicht erfüllt ist. Wenn Sie ein weiteres frühes Check-Through-Include ausführen, wird das Programm vorzeitig beendet, wenn es nicht erfüllt ist.
if(conditions.includes(a)|| (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))
Die Funktion trim () deckt nur breitere Leerzeichen und Tabulatoren ab und kommt nur im Randfall zum Einsatz.
Spielplatz
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]));
Machen wir es komplex - was ist, wenn unser zu vergleichender Wert das Array selbst ist und so tief verschachtelt sein kann, wie es sein kann? Was ist, wenn wir überprüfen möchten, ob ein Wert im Array leer ist? Dies kann ein Edge-Business-Case sein.
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']));
es ist eine einfache und umfassendere Anwendungsfallfunktion, die ich in mein Framework übernommen habe;
- Gibt die Kontrolle darüber, was genau die Definition von leer in einer bestimmten Situation ist
- Gibt die Kontrolle über die Neudefinition von Leerheitsbedingungen
- Kann für fast alles von String, Number, Float, Truthy, Null, Undefined und Deep Arrays vergleichen
- Die Lösung wird unter Berücksichtigung der Resuabilität und Flexibilität gezogen. Alle anderen Antworten sind für den Fall geeignet, dass ein oder zwei einfache Fälle behandelt werden sollen. Es gibt jedoch immer einen Fall, in dem die Definition leerer Änderungen beim Codieren über Snippets in diesem Fall fehlerfrei funktioniert.
if(data)würde ausreichen, wie es hier steht