Gibt es eine universelle JavaScript-Funktion, die überprüft, ob eine Variable einen Wert hat und ob dies nicht der Fall ist undefined
oder null
? Ich habe diesen Code, bin mir aber nicht sicher, ob er alle Fälle abdeckt:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
(truthy statement) ? true : false;
. Tu es einfach(truthy statement);
.if (hungry) …
stattif (hungry === true) …
. Wie bei allen Codierungsvorgängen auf diese Weise ist es nur Geschmackssache. Genauer gesagt zu dem Beispiel des OP sagt er noch ausführlicher: "Wenn es wahr ist, dann wahr, wenn nicht falsch". Aber wenn es wahr ist, dann ist es bereits wahr. Und wenn es falsch ist, ist es bereits falsch. Dies ist vergleichbar mit der Aussage: "Wenn Sie hungrig sind, sind Sie es, und wenn nicht, sind Sie es nicht."Antworten:
Sie können einfach überprüfen, ob die Variable einen
truthy
Wert hat oder nicht. Das bedeutetwird zu bewerten ,
true
wennvalue
ist nicht :Die obige Liste enthält alle möglichen
falsy
Werte in ECMA- / Javascript. Finden Sie es in der Spezifikation imToBoolean
Abschnitt.Wenn Sie nicht wissen, ob eine Variable vorhanden ist (dh wenn sie deklariert wurde ), sollten Sie sich beim
typeof
Operator erkundigen. Zum BeispielWenn Sie sicher sein können, dass mindestens eine Variable deklariert ist, sollten Sie direkt prüfen, ob sie einen
truthy
Wert wie oben gezeigt hat.Lesen Sie weiter: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html
quelle
if( value || value === false )
. Gleiches gilt für alle falschen Werte , die wir explizit validieren müssen.truthy
könnte irreführend sein. In diesem Fall sollten wirvalue.length != 0
nach einem nicht leeren Array suchen.if
den ternären Operator verwenden können, wenn Sie der Meinung sind, dass das Konstrukt syntaktisch zu schwer ist :var result = undefined ? "truthy" : "falsy"
. Oder wenn Sie nur auf einen Booleschen Wert zu zwingen wollen, verwenden Sie den!!
Operator, zum Beispiel!!1 // true
,!!null // false
.Die ausführliche Methode zum Überprüfen, ob der Wert undefiniert oder null ist, lautet:
Sie können auch den
==
Operator verwenden, dies setzt jedoch voraus, dass alle Regeln bekannt sind :quelle
null
oderundefined
kann so erfolgen :if (value == null)
.==
Achten Sie auf den Operator, der zwingt. Wenn Sie dies überprüfenif (value === null || value === undefined)
, haben Sie vergessen / wissen nicht, wie Javascript zwingt. webreflection.blogspot.nl/2010/10/…arg == null
die gleichen Ergebnisse liefert wiearg === undefined || arg === null
. Ich halte das letztere Beispiel jedoch für lesbarer.arg == null
ist meiner Erfahrung nach ziemlich häufig.return value === (void 0)
ist sicherer als das Testen, gegenundefined
das leider eine legitime Variable im Umfang sein kann.Dies wird true für zurückgeben
und Nullargumentfunktionen, da eine Funktion
length
die Anzahl der deklarierten Parameter ist, die sie benötigt.Um die letztere Kategorie nicht zuzulassen, möchten Sie möglicherweise nur nach leeren Zeichenfolgen suchen
quelle
undefined == null
aberundefined !== null
Dies ist der sicherste Scheck und ich habe ihn hier nicht genau so gesehen:
Es werden Fälle behandelt, in denen der Wert nie definiert wurde, und auch eine der folgenden:
Bearbeitet: Geändert zu strikter Gleichheit (! ==), weil es mittlerweile die Norm ist;)
quelle
typeof
Operator eine Zeichenfolge zurückgibt, sodass die Verwendung der strengen Gleichheitsprüfung technisch genauer, spezifischer und schneller ist. Es gibt also wirklich keinen Grund, den losen Vergleich zu verwenden, nicht umgekehrt. Auchval !== null
ist in vielen Fällen vollkommen gültig - ich mache es die ganze Zeit. Ich stimme Ihrem Argument der Nichtkonformität zu, aber ich denke, dies ist ein schlechtes Beispiel dafür. Ich versuche nicht, dich zu trollen.Die folgende Funktion kann hilfreich sein:
Oder in ES7 (Kommentar bei weiteren Verbesserungen)
Ergebnisse:
"Beachten Sie, dass der Bindungsoperator (: :) weder Teil von ES2016 (ES7) noch einer späteren Ausgabe des ECMAScript-Standards ist. Derzeit handelt es sich um einen Vorschlag der Stufe 0 (Strawman) für die Einführung in die Sprache." - Simon Kjellberg. Der Autor möchte seine Unterstützung für diesen schönen Vorschlag zum königlichen Aufstieg hinzufügen.
quelle
::
) weder Teil von ES2016 (ES7) noch eine spätere Ausgabe des ECMAScript-Standards ist. Derzeit handelt es sich um einen Vorschlag der Stufe 0 (Strawman) für die Einführung in die Sprache.Die erste Antwort mit der besten Bewertung ist falsch. Wenn der Wert undefiniert ist, wird in modernen Browsern eine Ausnahme ausgelöst. Sie müssen verwenden:
oder
quelle
undefined
Wert unterscheiden.if(value === 0) gameOver();
;)value
Null ist, was nicht das ist , wonach op sucht.Diese Zustandsprüfung
ist alles, was du brauchst.
quelle
if
Führt aber schon eine Fälschungsprüfung durch, die diese nur in einen Booleschen Wert umwandelt. Fängt es Fälle, die ein Normalerif(foo)
nicht fängt?active={!!foo}
! Überprüfen Sie, ob leere Zeichenfolgen (""), null, undefiniert, falsch und die Nummer 0 und NaN vorhanden sind. Angenommen, wenn eine Zeichenfolge leer
var name = ""
ist, wirdconsole.log(!name)
zurückgegebentrue
.Diese Funktion gibt true zurück , wenn val ist leer, null, nicht definiert, falsch, die Zahl 0 oder NaN .
ODER
Je nach Problemdomäne können Sie einfach like
!val
oder verwenden!!val
.quelle
isEmpty(val)
wenn Sie nur tun könnten!val
?!val
oder!!val
entsprechend Ihrer Problemdomäne verwenden.Eine Lösung, die mir sehr gefällt:
Definieren wir, dass eine leere Variable
null
oderundefined
, oder wenn sie eine Länge hat, Null ist oder wenn es sich um ein Objekt handelt, keine Schlüssel hat:Kehrt zurück:
undefined
,null
,""
,[]
,{}
true
,false
,1
,0
,-1
,"foo"
,[1, 2, 3]
,{ foo: 1 }
quelle
Du übertreibst es ein bisschen. Um zu überprüfen, ob einer Variablen kein Wert zugewiesen wurde, müssen Sie nur gegen undefiniert und null prüfen.
Dies setzt voraus
0
,""
und Objekte (auch leere Objekte und Arrays) sind gültige "Werte".quelle
Wenn Sie einfaches Javascript bevorzugen, versuchen Sie Folgendes:
Andernfalls versuchen Sie Folgendes, wenn Sie bereits Unterstrich oder lodash verwenden:
quelle
_.isNil
ist die Funktion, die Sie suchen, nicht_.isEmpty
. isNil Dokumentation , isEmpty DokumentationisArray
oderisString
funktioniert nicht auf demwindow
.Hier ist meins - gibt true zurück, wenn der Wert null, undefiniert usw. oder leer ist (dh nur Leerzeichen enthält):
quelle
ist eine wirklich schöne und saubere Art, an vielen Stellen damit umzugehen, kann auch zum Zuweisen von Variablen verwendet werden
quelle
true
und Sie versuchen, einenval
von zu liefern oder zurückzugebenfalse
.const res = falsyValue ? true : falsyValue
Wenn die Variable nicht deklariert wurde, können Sie mit einer Funktion nicht auf undefiniert testen, da eine Fehlermeldung angezeigt wird.
Beide erzeugen einen Fehler, wenn foo nicht deklariert wurde.
Wenn Sie testen möchten, ob eine Variable deklariert wurde, können Sie verwenden
Wenn Sie testen möchten, ob foo deklariert wurde und einen Wert hat, den Sie verwenden können
quelle
Standardwert überprüfen
Überprüfe das Ergebnis:
Ich habe die @ Vix-Funktion () verwendet, um das Objekt von welchem Typ zu überprüfen.
mit instansof «
quelle
// Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
In ES6 mit Trim für Whitespace-Strings:
quelle
Es kann nützlich sein.
Alle Werte im Array stellen dar, was Sie sein möchten (null, undefiniert oder andere Dinge), und Sie suchen, was Sie darin möchten.
quelle
Wenn Sie "Werte verwenden
TypeScript
und diese nicht berücksichtigen möchten "false
ist dies die Lösung für Sie:Zuerst:
import { isNullOrUndefined } from 'util';
Dann:
isNullOrUndefined(this.yourVariableName)
Bitte beachten Sie: Wie unten erwähnt, ist dies jetzt veraltet. Verwenden Sie
value === undefined || value === null
stattdessen. ref .quelle
/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
typescript
Sache. Können Sie bitte den Link der Dokumentation angeben?Leere
Ich empfehle nicht, eine Funktion zu definieren oder zu verwenden, die berechnet, ob ein Wert auf der ganzen Welt leer ist. Was bedeutet es wirklich, "leer" zu sein? Wenn ja
let human = { name: 'bob', stomach: 'empty' }
, sollte ichisEmpty(human)
zurückkehrentrue
? Wenn jalet reg = new RegExp('');
, sollte ichisEmpty(reg)
zurückkehrentrue
? Was ist mitisEmpty([ null, null, null, null ])
- diese Liste enthält nur Leere, ist die Liste selbst also leer? Ich möchte hier einige Anmerkungen zur "Leere" (ein absichtlich undurchsichtiges Wort, um bereits bestehende Assoziationen zu vermeiden) in Javascript machen - und ich möchte argumentieren, dass "Leere" in Javascript-Werten niemals generisch behandelt werden sollte.Wahrhaftigkeit / Falschheit
Um zu entscheiden, wie die "Leere" von Werten bestimmt werden soll, müssen wir dem in Javascript eingebauten, inhärenten Gefühl Rechnung tragen, ob Werte "wahr" oder "falsch" sind. Natürlich
null
undundefined
sind beide "falsch". Weniger natürlich ist die Nummer0
(und keine andere Nummer außerNaN
) auch "falsch". Am wenigsten natürlich:''
ist falsch, aber[]
und{}
(undnew Set()
, undnew Map()
) sind wahr - obwohl sie alle gleich leer scheinen!Null vs Undefiniert
Es gibt auch einige Diskussionen über
null
vsundefined
- brauchen wir wirklich beides, um Leere in unseren Programmen auszudrücken? Ich persönlich vermeide es, dass die Buchstaben u, n, d, e, f, i, n, e, d in dieser Reihenfolge in meinem Code erscheinen. Ich benutze immernull
"Leere". Aber auch hier müssen wir dem inhärenten Sinnnull
undundefined
Unterschied von Javascript Rechnung tragen :undefined
undefined
:undefined
, nichtnull
:Nicht generische Leere
Ich glaube, dass Leere niemals generisch behandelt werden sollte. Wir sollten stattdessen immer die Sorgfalt haben, mehr Informationen über unsere Daten zu erhalten, bevor wir feststellen, ob sie leer sind. Dazu überprüfe ich hauptsächlich, mit welcher Art von Daten ich es zu tun habe:
Beachten Sie, dass diese Funktion den Polymorphismus ignoriert - sie erwartet
value
, dass es sich um eine direkte Instanz vonCls
und nicht um eine Instanz einer Unterklasse von handeltCls
. Ich vermeideinstanceof
aus zwei Hauptgründen:([] instanceof Object) === true
("Ein Array ist ein Objekt")('' instanceof String) === false
("Ein String ist kein String")Beachten Sie, dass dies
Object.getPrototypeOf
verwendet wird, um einen Fall wie zu vermeiden.let v = { constructor: String };
DieisType
Funktion gibt fürisType(v, String)
(false) undisType(v, Object)
(true) immer noch korrekt zurück .Insgesamt empfehle ich die Verwendung dieser
isType
Funktion zusammen mit den folgenden Tipps:let v = JSON.parse(someRawValue);
ist unserev
Variable jetzt von unbekanntem Typ. Wir sollten so früh wie möglich unsere Möglichkeiten einschränken. Der beste Weg, dies zu tun, kann darin bestehen, einen bestimmten Typ zu benötigen: zBif (!isType(v, Array)) throw new Error('Expected Array');
- dies ist ein sehr schneller und ausdrucksstarker Weg, um die generische Natur von zu entfernenv
und sicherzustellen, dass es immer ein istArray
. Manchmal müssen wir jedoch zulassenv
, dass es mehrere Typen gibt. In diesen Fällen sollten wirv
so früh wie möglich Codeblöcke erstellen, die nicht mehr generisch sind:if (v === null) throw new Error('Null value rejected');
- dies ist großartig, um sicherzustellen, dassnull
Werte es nicht schaffen, aber wenn ein Wert es schafft , wissen wir es immer noch kaum irgendetwas darüber. Ein Wert,v
der diese Nullprüfung besteht, ist immer noch SEHR generisch - es ist alles andere alsnull
! Blacklists zerstreuen kaum die Generizität.null
Betrachten Sie niemals "einen leeren Wert", es sei denn, es handelt sich um einen Wert . Betrachten Sie stattdessen "ein leeres X". Denken Sie im Wesentlichen niemals daran, etwas Ähnliches zu tunif (isEmpty(val)) { /* ... */ }
- egal wie dieseisEmpty
Funktion implementiert ist (ich möchte es nicht wissen ...), sie ist nicht sinnvoll! Und es ist viel zu allgemein! Die Leere sollte nur mit Kenntnis desval
Typs berechnet werden . Leerheitsprüfungen sollten folgendermaßen aussehen:if (isType(val, String) && val.length === 0) ...
if (isType(val, Object) && Object.entries(val).length === 0) ...
if (isType(val, Number) && val <= 0) ...
"Ein Array ohne Elemente":
if (isType(val, Array) && val.length === 0) ...
Die einzige Ausnahme ist, wann
null
bestimmte Funktionen angegeben werden. In diesem Fall ist es sinnvoll zu sagen: "Ein leerer Wert":if (val === null) ...
quelle
Versuchen Sie es mit einer anderen Logik . Sie können den folgenden Code verwenden, um alle vier (4) Bedingungen für die Validierung zu überprüfen, z. B. nicht null, nicht leer, nicht undefiniert und nicht null. Verwenden Sie nur diesen Code (! (! (Variable))) in Javascript und jquery.
quelle
Sie können sich diese Funktion - den
??
Operator - als eine Möglichkeit vorstellen, beim Umgang mitnull
oder auf einen Standardwert zurückzugreifenundefined
.Wiederum entspricht der obige Code dem folgenden.
quelle
Diese Lösung ist jedoch überentwickelt. Wenn Sie die Funktion später nicht für geschäftliche Modellanforderungen ändern möchten, ist es sauberer, sie direkt im Code zu verwenden:
quelle
Dies wird niemals einen Fehler auslösen. Wenn myObject , child oder myValue null ist, ist myNewValue null. Es werden keine Fehler ausgegeben
quelle
Für alle, die wegen ähnlicher Fragen hierher kommen, funktioniert Folgendes hervorragend und ich habe es in den letzten Jahren in meiner Bibliothek:
quelle
Wenn Sie vermeiden möchten, dass der Wert wahr wird, wenn der Wert laut jAndys Antwort einer der folgenden ist :
Eine mögliche Lösung, die es vermeiden könnte, wahrheitsgemäße Werte zu erhalten, ist die folgende:
Es würde wie folgt verwendet werden:
Zusätzlich zu diesen Szenarien möchten Sie möglicherweise false zurückgeben, wenn das Objekt oder Array leer ist:
Sie würden es so machen:
Wenn Sie nach allen Leerzeichenfolgen ("") suchen möchten, können Sie Folgendes tun:
Hinweis:
hasOwnProperty
Gibt true für leere Zeichenfolgen, 0, false, NaN, null und undefined zurück, wenn die Variable als eine von ihnen deklariert wurde, sodass sie möglicherweise nicht die beste ist. Die Funktion kann geändert werden, um anzuzeigen, dass sie deklariert wurde, ist jedoch nicht verwendbar.quelle
Code auf GitHub
Tests des armen Mannes 😁
Testergebnisse:
quelle
value.constructor === Object
? Überprüfen Sie dies .value.constructor === Object
ist in Ordnung, in Javascript haben IF-OR-Anweisungen eine Ausführungsreihenfolge, sodass die OR-Anweisung nur ausgeführt wird, wenn die vorherige nicht TRUE zurückgegeben hat und wir bereits nachgesehen habenNull
. Tatsächlich besteht der einzige Zweck dieser letzten OR-Anweisung darin, zu erkennen{}
und sicherzustellen, dass sie für Dinge, die sie nicht sollte, nicht TRUE zurückgibt.Dadurch wird geprüft, ob die Variable der unbestimmten Verschachtelung undefiniert ist
Das obige prüft, ob die Google Übersetzungsfunktion TranslateElement vorhanden ist. Dies entspricht:
quelle
Der optionale Verkettungsoperator bietet eine Möglichkeit, den Zugriff auf Werte über verbundene Objekte zu vereinfachen, wenn eine Referenz oder Funktion möglicherweise undefiniert oder null ist.
Der Null-Koaleszenz-Operator kann nach der optionalen Verkettung verwendet werden, um einen Standardwert zu erstellen, wenn keiner gefunden wurde:
quelle
Außerdem werden Leerzeichen ('') und Folgendes überprüft:
quelle
Ich denke mit dem? Bediener ist etwas sauberer.
quelle