Wie kann ich in JavaScript nach einer leeren / undefinierten / Null-Zeichenfolge suchen?


2854

Ich habe diese Frage gesehen , aber kein JavaScript-spezifisches Beispiel. Gibt es ein einfaches string.Emptyin JavaScript verfügbares oder ist es nur eine Frage der Suche ""?


2
Nur zu Ihrer Information, ich denke, die nützlichsten APIs für die String-Klasse sind Mozilla und Javascript Kit . [elated.com] ( elated.com/articles/working-with-strings ) bietet ein Tutorial zu allen Eigenschaften, Methoden, ... Bitte beachten Sie: Der Mozilla-Link wurde auf developer.mozilla.org/en/
Gene T


Es wäre sehr hilfreich, wenn die Anforderung klar spezifiziert wäre. Für welche Werte sollte isEmpty true zurückgeben? Wenn Sie nach "" suchen, wird darauf geschlossen, dass nur dann true zurückgegeben werden soll, wenn der Wert Type string und length 0 ist. Bei vielen Antworten wird davon ausgegangen, dass für einige oder alle Falsey-Werte auch true zurückgegeben werden sollte.
RobG

Antworten:


3571

Wenn Sie nur überprüfen möchten, ob ein Wert vorhanden ist, können Sie dies tun

if (strValue) {
    //do something
}

Wenn Sie speziell nach einer leeren Zeichenfolge über Null suchen müssen, ist es meiner Meinung nach am ""besten, mit dem ===Operator zu prüfen (damit Sie wissen, dass es sich tatsächlich um eine Zeichenfolge handelt, mit der Sie vergleichen).

if (strValue === "") {
    //...
}

174
Das Testen der Eigenschaft length ist möglicherweise schneller als das Testen des Strings gegen "", da der Interpreter kein String-Objekt aus dem String-Literal erstellen muss.
Vincent Robert

26
@ Vincent machte einige naive Profilerstellung in Chrome-Entwicklertools, Test === ''vs .lengthzeigte keine erkennbare Verbesserung (und die Verwendung .lengthfunktioniert nur, wenn Sie davon ausgehen können, dass Sie eine Zeichenfolge haben)
bdukes

26
@bdukes, wenn Sie anfangen, sich um diese Art von Mikrooptimierungen zu kümmern, denke ich nicht, dass Chrome der Browser ist, in dem Sie die meisten Ihrer Leistungsprobleme haben ...
Vincent Robert

15
Nur zu beachten, wenn Ihre Definition von "leerer String" Leerzeichen enthält, ist diese Lösung nicht geeignet. Eine Zeichenfolge mit 1 oder mehr Leerzeichen gibt oben true zurück. Wenn Sie JQuery verwenden, können Sie einfach Folgendes verwenden: if ($ .trim (ref) .length === 0) - gemäß dieser Antwort auf eine ähnliche Frage: stackoverflow.com/questions/2031085/…
CodeClimber

115
Wie erwartet .length > 0ist es tatsächlich viel schneller als im Vergleich zu einem String-Literal! Schauen Sie sich diese jsPerf
Chad

1128

Um zu überprüfen, ob eine Zeichenfolge leer, null oder undefiniert ist, verwende ich:

function isEmpty(str) {
    return (!str || 0 === str.length);
}

Um zu überprüfen, ob eine Zeichenfolge leer, null oder undefiniert ist, verwende ich:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

So überprüfen Sie, ob eine Zeichenfolge leer ist oder nur Leerzeichen enthält:

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};

21
warum 0 === str.length statt str.length === 0?
Vincent

66
@ Vincent-Bedingungen werden oft so geschrieben. if (variable == constant value)Wenn Sie ein '=' vergessen, weisen Sie der Variablen den konstanten Wert zu, anstatt zu testen. Der Code funktioniert weiterhin, da Sie eine Variable in einem if zuweisen können. Eine sicherere Möglichkeit, diese Bedingung zu schreiben, besteht darin, den konstanten Wert und die Variable umzukehren. Auf diese Weise wird beim Testen Ihres Codes ein Fehler angezeigt (ungültige Lef-Hand-Seite bei der Zuweisung). Sie können auch so etwas wie JSHint verwenden, um die Zuweisung unter Bedingungen zu verbieten und gewarnt zu werden, wenn Sie eine schreiben.
Florian

2
Schade, dass /^\s*$/.test(str)das nicht wirklich lesbar ist - vielleicht wäre es besser, Leerzeichen mit einfacherem Code oder Regex zu entfernen? siehe stackoverflow.com/questions/6623231/… und auch stackoverflow.com/questions/10800355/…
Adrien Be

6
/^\s*$/.test(str) kann durch str.trim () ersetzt werden. length === 0
Schadenfreude

21
@ Vincent dies wird auch "Yoda Conditions" genannt, wie if blue is the sky. Siehe dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ.

316

Alle vorherigen Antworten sind gut, aber das wird noch besser. Verwenden Sie den Operator !!( nicht nicht ).

if(!!str){
    // Some code here
}

Oder verwenden Sie Typ Casting:

if(Boolean(str)){
    // Code here
}

Beide haben die gleiche Funktion. Geben Sie die Variable in Boolean ein, wobei stres sich um eine Variable handelt.
Es kehrt zurück falsefür null,undefined,0,000,"",false.
Es wird truefür die Zeichenfolge "0" und das Leerzeichen "" zurückgegeben.


61
Warum ist das "noch besser"?
Mene

33
Gibt es einen Unterschied zwischen dem Verhalten von if(str)und if(!!str)?
Peter Olson

6
@PeterOlson Wenn Sie versuchen, eine Variable als Booleschen Wert zu speichern, der mehrere Zeichenfolgen auf Inhalt überprüft, sollten Sie dies tun. Auch bekannt als var any = (!!str1 && !!str2 && !!str3)Behandlung, wenn dort auch eine Nummer enthalten ist
John Ruddell

23
Dies ist die Lösung, die ich immer benutze. !!str.trim()um sicherzustellen, dass die Zeichenfolge nicht nur aus Leerzeichen besteht.
Dario Oddenino

5
Sieht nicht wie ein Hack aus, Boolean(str)ist viel besser lesbar und weniger "wtfish".
Shinzou

105

Das nächste, was Sie erreichen können str.Empty(unter der Voraussetzung, dass str ein String ist), ist:

if (!str.length) { ...

9
Würde das nicht eine Ausnahme auslösen, wenn str null ist?
Pic Mickael

3
@ PicMickael Ja! Würde auch str.Empty.
Ates Goral

99

Wenn Sie sicherstellen müssen, dass die Zeichenfolge nicht nur eine Reihe von Leerzeichen ist (ich gehe davon aus, dass dies zur Formularüberprüfung dient), müssen Sie die Leerzeichen ersetzen.

if(str.replace(/\s/g,"") == ""){
}

8
Aber macht den Job, wenn Sie tatsächlich eine Zeichenfolge mit Nicht-Leerzeichen-Inhalt testen möchten. Gibt es eine kostengünstigere Möglichkeit, dies zu testen?
Flash

4
Wie wäre es mit der Längeneigenschaft?
DriAn

27
Anstatt alle Leerzeichen zu entfernen, prüfen Sie doch einfach, ob kein Leerzeichen vorhanden ist. Hat zwei Vorteile, die es frühzeitig beenden kann, wenn es ein Nicht-Leerzeichen gibt, und es hat keine neue Zeichenfolge zurückgegeben, gegen die Sie dann prüfen. if(str.match(/\S/g)){}
Mpen

34
@ Mark FYI, Sie würden den globalen Modifikator nicht benötigen, da die Übereinstimmung des ersten Auftretens eines Nicht-Leerzeichens bedeuten würde, dass die Zeichenfolge nicht leer ist:str.match(/\S/)
neezer

1
warum ist es teuer Wenn ja, warum verwendet jQuery diese Methode? Sie finden dies in var trimLeft = /^\s+/, trimRight = /\s+$/;
jQuerys

66

Ich benutze:

function empty(e) {
  switch (e) {
    case "":
    case 0:
    case "0":
    case null:
    case false:
    case typeof(e) == "undefined":
      return true;
    default:
      return false;
  }
}

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
})) // false

5
Diese Lösung ist sprachunabhängiger. Die einzige JavaScript-Funktion, auf die es sich stützt, ist typeof. Es ist also ein gutes Beispiel für eine Lösung, die Sie verwenden können, wenn Sie den Implementierungen in verschiedenen Browsern nicht vertrauen und keine Zeit haben, eine bessere Lösung zu finden. (IE, kein Internetzugang). Es ist so etwas wie ein Beweis. Nicht das sauberste, aber Sie können sicher sein, dass es funktioniert, ohne zu viel über JavaScript zu wissen.
Jeff Davis

2
Ich würde noch ein bisschen weiter gehen und es mit einem === Operator für den undefinierten Fall festnageln. Ansonsten ist es einfach die perfekte Antwort.
Xarlymg89

Das typeofin der switchhat bei mir nicht funktioniert. Ich habe einen if (typeof e == "undefined")Test hinzugefügt und das funktioniert. Warum?
Lucas

1
@ Lucas Weil dies ein Tippfehler oder ein Versehen war. Ihre Änderung ist der richtige Ansatz. (Das Original bezieht sich auf den Kontext der leeren Funktion, nicht auf den Parameter e, den die Funktion überprüfen soll.)
beeThree

Könnten wir case undefined:statt verwenden case typeof(e) == "undefined":?
Boris J.

43

Sie können lodash verwenden : _.isEmpty (Wert).

Es umfasst eine Menge von Fällen wie {}, '', null, undefinedetc.

Aber es gibt immer truefür NumberArt von JavaScript primitiven Datentypen wie _.isEmpty(10)oder _.isEmpty(Number.MAX_VALUE)beide zurückkehren true.


_.isEmpty(" "); // => false
Erich

1
@Erich Weil " "nicht leer ist. _.isEmpty("");gibt true zurück.
Moshii

1
Ganz richtig - ich habe dies erwähnt, weil einige der anderen Antworten hier eine Formularüberprüfung und die Überprüfung implizieren, ob eine Zeichenfolge nur aus Leerzeichen besteht, und diese einzelne Lodash-Funktion allein dieses Problem nicht lösen wird.
Erich

@Erich, jetzt habe ich deinen Standpunkt verstanden, danke für die Erwähnung.
Moshii

36

Funktion:

function is_empty(x)
{
    return (
        (typeof x == 'undefined')
                    ||
        (x == null)
                    ||
        (x == false)  //same as: !x
                    ||
        (x.length == 0)
                    ||
        (x == "")
                    ||
        (x.replace(/\s/g,"") == "")
                    ||
        (!/[^\s]/.test(x))
                    ||
        (/^\s*$/.test(x))
    );
}

PS: Verwenden Sie in JavaScript keinen Zeilenumbruch danach return.


1
Gibt es eine Chance, dass Sie erklären können, was jeder Scheck tut? :)
DanV

2
-1 Sie testen auf verschiedene Dinge. Es macht keinen Sinn, sie alle in einer ifAussage zusammenzufassen.
Bennett McElwee

1
typeof MyVariable == 'undefined' unterscheidet nicht zwischen einer initialisierten Variablen mit einem undefinierten Wert und einer nicht deklarierten Variablen, es sei denn, die Variable wurde ursprünglich deklariert und auf null initialisiert. Durch Überprüfen der Eigenschaft length wird das Zeichenfolgenprimitiv in ein Zeichenfolgenobjekt eingeschlossen.
Scott Marcus

35

Versuchen:

if (str && str.trim().length) {  
    //...
}

2
Ist die Längeneigenschaft notwendig?
Frogcoder

str.trim().lengthwird str.trim()nach meinem eigenen Testergebnis um etwa 1% schneller als .
Devildelta

2
@devildelta - Ihre 1% ist ein Fehler in Ihrem Test.
Stephen M Irving

OP sucht nach leeren Zeichenfolgen, undefiniert oder null. Dies testet auf eine Zeichenfolge, die keine dieser Bedingungen erfüllt. Er sagte auch nichts über Leerzeichen, nur Saiten. Damit können Sie die Bedingungen des OP testen, sofern Sie sicher sind, dass keine anderen Datentypen in der Variablen gespeichert sind: if (!str) { ... }
Stephen M Irving

34
var s; // undefined
var s = ""; // ""
s.length // 0

In JavaScript gibt es nichts, was eine leere Zeichenfolge darstellt. Führen Sie eine Überprüfung gegen length(wenn Sie wissen, dass die Variable immer eine Zeichenfolge sein wird) oder gegen""


29

Ich würde mir keine Sorgen um die effizienteste Methode machen. Verwenden Sie das, was Ihrer Absicht am klarsten ist. Für mich ist das normalerweise strVar == "".

Laut dem Kommentar von Constantin wäre dies in der Tat eine dieser Situationen, in denen die Absicht geklärt werden könnte, wenn strVar einen ganzzahligen Wert von 0 enthalten könnte.


11
Schlechte Idee. Sie werden wahr, wenn strVar versehentlich 0 zugewiesen wird.
Constantin

5
Ich bin damit einverstanden, dass es wichtiger ist, Ihre Absicht klar zu machen, als Mikrooptimierungen, die andere Methoden liefern könnten, aber die Verwendung des strengen Vergleichsoperators === wäre besser. Es wird nur true zurückgegeben, wenn strVares sich um eine leere Zeichenfolge handelt.
Nutzloser Code

Die Prüfung schlägt fehl, wenn sie nicht definiert ist. Also wenn (str) besser funktioniert
Valentin Heinitz

3
@ValentinHeinitz, wenn str ein Falsey-Wert von 0 oder "0" zugewiesen wurde, wenn (str) fälschlicherweise true melden würde. Der beste Ansatz ist if (str === ""). Es ist einfach und wird niemals scheitern.
Scott Marcus


20

Viele Antworten und viele verschiedene Möglichkeiten!

Ohne Zweifel für eine schnelle und einfache Implementierung ist der Gewinner: if (!str.length) {...}

Es sind jedoch ebenso viele andere Beispiele verfügbar. Die beste funktionale Methode, um dies zu erreichen, würde ich vorschlagen:

function empty(str)
{
    if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str) || /^\s*$/.test(str) || str.replace(/\s/g,"") === "")
    {
        return true;
    }
    else
    {
        return false;
    }
}

Ein bisschen übertrieben, ich weiß.


2
Das Überprüfen auf undefinierte Elemente muss bei den Überprüfungen an die erste Stelle verschoben werden, da sonst nicht definierte Elemente Ausnahmen für die früheren Überprüfungen auslösen.
SvdSinner

Stimme voll und ganz zu! Schöner Fang. Ich werde meine obige Antwort bearbeiten!
tfont

str.length === 0Gibt true für jede Funktion zurück, die keine formalen Parameter hat.
RobG

20

Sie können auch reguläre Ausdrücke verwenden:

if((/^\s*$/).test(str)) { }

Sucht nach Zeichenfolgen, die entweder leer oder mit Leerzeichen gefüllt sind.


Es funktioniert, aber es ist auch schrecklich teuer. Gut, wenn Sie nur ein oder zwei Dinge überprüfen möchten, nicht ein großes Set.
Orpheus

20

Performance

Ich führe Tests unter macOS 10.13.6 (High Sierra) für 18 ausgewählte Lösungen durch. Die Lösungen funktionieren etwas anders (für Eckfall-Eingabedaten), die im folgenden Snippet dargestellt wurden.

Schlussfolgerungen

  • die einfachen Lösungen auf Basis von !str, ==, ===und lengthist schnell für alle Browser (A, B, C, G, I, J)
  • Die Lösungen basieren auf dem regulären Ausdruck ( test, replace) und charAtsind für alle Browser am langsamsten (H, L, M, P).
  • Die als am schnellsten gekennzeichneten Lösungen waren nur für einen Testlauf am schnellsten - in vielen Läufen ändert sich dies jedoch innerhalb der Gruppe "schnelle" Lösungen

Geben Sie hier die Bildbeschreibung ein

Einzelheiten

Im folgenden Snippet vergleiche ich die Ergebnisse der ausgewählten 18 Methoden anhand verschiedener Eingabeparameter

  • "" "a" " "- leere Zeichenfolge, Zeichenfolge mit Buchstaben und Zeichenfolge mit Leerzeichen
  • [] {} f- Array, Objekt und Funktion
  • 0 1 NaN Infinity - Zahlen
  • true false - Boolescher Wert
  • null undefined

Nicht alle getesteten Methoden unterstützen alle Eingabefälle.

Und dann für alle Methoden , die ich Geschwindigkeit Testfall durchführen str = ""für Browser Chrome v78.0.0, Safari v13.0.4 und Firefox v71.0.0 - können Sie Tests auf Ihrem Rechner laufen hier

Geben Sie hier die Bildbeschreibung ein


Das ist wirklich großartig! Ich liebe es, all das angelegt zu sehen! Vielen Dank!
WebWanderer

Das ist eine gründliche Studie - danke
Deian

19
  1. Überprüfen Sie, ob var a;vorhanden
  2. Schneiden Sie false spacesden Wert aus und testen Sie ihn aufemptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }

17

Für den Fall, dass Sie eine mit Leerzeichen gefüllte Zeichenfolge als "leer" betrachten.

Sie können es mit diesem regulären Ausdruck testen:

!/\S/.test(string); // Returns true if blank.

14

Ich benutze normalerweise so etwas,

if (!str.length) {
    // Do something
}

3
Am schnellsten, wenn Sie wissen, dass die Variable eine Zeichenfolge ist. Wirft einen Fehler, wenn die Variable undefiniert ist.
Adrian Hope-Bailie

@ AdrianHope-Bailie warum würdest du eine undefinierte Variable testen?
Abimael Martell

2
@AbimaelMartell Warum nicht? Sie haben eine Variable, die Sie entweder deklariert haben oder die Ihnen aus einem Bereich übergeben wurde, über den Sie keine Kontrolle haben, z. B. in einer Antwort von einer Methode oder einem API-Aufruf. Sie können davon ausgehen, dass es einen Wert enthält, und die obige Prüfung verwenden. Wenn dieser Wert jedoch nicht definiert oder null ist, wird eine Fehlermeldung angezeigt. var test = null; if (! test.length) {alert ("adrian ist falsch");}
Adrian Hope-Bailie

OP fragte nach "wie man nach einer leeren Zeichenfolge sucht", eine undefinierte Variable ist keine leere Zeichenfolge. Auf jeden Fall können Sie überprüfen, typeof variable != "undefined"bevor Sie überprüfen , ob es leer ist.
Abimael Martell

10

Ich habe keine Antwort bemerkt, die die Möglichkeit von Nullzeichen in einer Zeichenfolge berücksichtigt. Wenn wir zum Beispiel eine Nullzeichenfolge haben:

var y = "\0"; // an empty string, but has a null character
(y === "") // false, testing against an empty string does not work
(y.length === 0) // false
(y) // true, this is also not expected
(y.match(/^[\s]*$/)) // false, again not wanted

Um seine Nullheit zu testen, könnte man so etwas tun:

String.prototype.isNull = function(){ 
  return Boolean(this.match(/^[\0]*$/)); 
}
...
"\0".isNull() // true

Es funktioniert mit einer Nullzeichenfolge und einer leeren Zeichenfolge und ist für alle Zeichenfolgen zugänglich. Darüber hinaus könnte es erweitert werden, um andere leere JavaScript- oder Leerzeichen zu enthalten (z. B. nicht unterbrechendes Leerzeichen, Byte-Ordnungszeichen, Zeilen- / Absatztrennzeichen usw.).


2
Interessante Analyse. Ich denke nicht, dass dies in 99,9% der Fälle relevant wäre. ABER ich habe kürzlich festgestellt, dass MySQL eine Spalte mit "null" auswertet, wenn (und nur wenn) diese Spalte das Nullzeichen ("\ 0") enthält. Oracle hingegen würde "\ 0" nicht als null bewerten und es vorziehen, es als Zeichenfolge der Länge 1 zu behandeln (wobei dieses eine Zeichen das Nullzeichen ist). Dies kann zu Verwirrung führen, wenn es nicht richtig behandelt wird, da viele Webentwickler mit einer Back-End-Datenbank arbeiten, die möglicherweise verschiedene Arten von "Null" -Werten durchläuft. Es sollte im Hinterkopf eines jeden Entwicklers sein.
Cartbeforehorse

10

In der Zwischenzeit können wir eine Funktion haben, die nach allen 'Leergut' wie null, undefined, '', '', {}, [] sucht . Also habe ich das gerade geschrieben.

var isEmpty = function(data) {
    if(typeof(data) === 'object'){
        if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
            return true;
        }else if(!data){
            return true;
        }
        return false;
    }else if(typeof(data) === 'string'){
        if(!data.trim()){
            return true;
        }
        return false;
    }else if(typeof(data) === 'undefined'){
        return true;
    }else{
        return false;
    }
}

Anwendungsfälle und Ergebnisse.

console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty('  ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false

10

Derzeit gibt es keine direkte Methode wie string.empty, um zu überprüfen, ob ein String leer ist oder nicht. In Ihrem Code können Sie jedoch eine Wrapper-Prüfung für eine leere Zeichenfolge verwenden, z.

// considering the variable in which your string is saved is named str.

if (str && str.length>0) { 

  // Your code here which you want to run if the string is not empty.

}

Auf diese Weise können Sie auch sicherstellen, dass die Zeichenfolge nicht undefiniert oder auch null ist. Denken Sie daran, undefiniert, null und leer sind drei verschiedene Dinge.


Es würde einen Fehler bei null oder undefiniert auslösen, da wir nicht direkt eine Operation für eine Variable ausführen sollten, die null oder undefiniert ist - prüfen Sie, ob str vorhanden ist, bevor Sie dies tun, wie in anderen Antworten angegeben, und beachten Sie auch, dass dies bei let abc funktionieren würde = '' aber nicht auf let abc = '', diese beiden sind unterschiedlich.
whoami

Betrachten Sie let rand = ()=>Math.random(), dann wird rand && rand.length > 0)false zurückgegeben, aber fn ist eindeutig nicht "leer". Dh es gibt false für jede Funktion zurück, die keine Formatparameter hat.
RobG

@RobG Math.random()gibt eine Zahl und keine Zeichenfolge zurück. Und diese Antwort handelt von Strings. ;-)
Harshit Agarwal

10

Alle diese Antworten sind nett.

Ich kann jedoch nicht sicher sein, ob die Variable eine Zeichenfolge ist, nicht nur Leerzeichen enthält (dies ist für mich wichtig) und auch '0' (Zeichenfolge) enthalten kann.

Meine Version:

function empty(str){
    return !str || !/[^\s]+/.test(str);
}

empty(null); // true
empty(0); // true
empty(7); // false
empty(""); // true
empty("0"); // false
empty("  "); // true

Probe auf jsfiddle .


1
Huh? Wenn Sie eine Zeichenfolge erwarten empty(0)und empty(7)denselben Wert zurückgeben sollten.
Bennett McElwee

In meinem speziellen Fall - empty("0")muss zurückkehren false(weil das eine nicht leere Zeichenfolge ist), empty(0)muss aber zurückkehren, trueweil es leer ist :)
Andron

Aber 0 ist nicht leer! Es ist eine Zahl, und Zahlen können nicht voll oder leer sein. Natürlich ist es Ihre Funktion und muss daher Ihren Anforderungen entsprechen, ist aber emptyin diesem Fall ein irreführender Name.
Bennett McElwee

Ich denke diesen Namen empty gut. In PHP-Dokumenten für leere Funktion: Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.Der Unterschied zwischen PHPund dieser Funktion - diese Zeichenfolge '0'wird nicht als leer identifiziert.
Andron

Wie ich schon sagte, es ist Ihre Funktion: Nennen Sie es, was Sie wollen. Ist emptyaber ein ungenauer und irreführender Name. Es ist interessant, dass PHP auch eine schlecht benannte emptyFunktion hat, aber die Fehler von PHP haben nichts mit JavaScript zu tun.
Bennett McElwee

10

Ich habe hier keine gute Antwort gesehen (zumindest keine Antwort, die zu mir passt)

Also beschloss ich, mir selbst zu antworten:

value === undefined || value === null || value === "";

Sie müssen überprüfen, ob es undefiniert ist. Andernfalls kann Ihre Methode explodieren und Sie können überprüfen, ob sie gleich null oder gleich einer leeren Zeichenfolge ist.

Das kannst du nicht haben !! oder nur if(value)seitdem, wenn Sie überprüfen, wird 0es Ihnen eine falsche Antwort geben (0 ist falsch).

Wenn dies gesagt ist, wickeln Sie es in eine Methode wie:

public static isEmpty(value: any): boolean { return value === undefined || value === null || value === ""; }

PS.: Sie müssen den Typ nicht überprüfen , da er explodieren und werfen würde, noch bevor er in die Methode eintritt


Verwenden Sie wahrscheinlich besser das Boolesche Konstrukt (Wert), das undefinierte und Nullwerte (und auch 0, -0, falsch, NaN) als falsch behandelt. Siehe stackoverflow.com/questions/856324/…
Zhuravlev A.

9

Wenn man nicht nur leere, sondern auch leere Zeichenfolgen erkennen muss, werde ich zu Gorals Antwort hinzufügen:

function isEmpty(s){
    return !s.length;    
}

function isBlank(s){
    return isEmpty(s.trim());    
}

8

Versuche dies

str.value.length == 0

3
"".value.lengthwird einen Fehler verursachen. Es sollte seinstr.length === 0
AndFisher

Dies ist ein TypeErrorIf strgleich undefinedodernull
RousseauAlexandre

8

Sie können es einfach zu einem nativen String- Objekt in JavaScript hinzufügen und es immer wieder verwenden ...
Etwas Einfaches wie der folgende Code kann die Arbeit für Sie erledigen, wenn Sie ''leere Strings überprüfen möchten :

String.prototype.isEmpty = String.prototype.isEmpty || function() {
  return !(!!this.length);
}

Wenn Sie andernfalls sowohl ''leere Zeichenfolgen als auch ' 'Leerzeichen überprüfen möchten , können Sie dies tun, indem Sie einfach trim()den folgenden Code hinzufügen :

String.prototype.isEmpty = String.prototype.isEmpty || function() {
   return !(!!this.trim().length);
}

und Sie können es so nennen:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false

Welchen Nutzen hat es, !(!!this.length)nicht nur !this(oder !this.trim()für die zweite Option) zu tun ? Eine Zeichenfolge mit der Länge Null ist bereits falsch, die Klammern sind redundant, und das dreimalige Negieren entspricht genau dem einmaligen Negieren.
John Montgomery

8

Versuche dies:

export const isEmpty = string => (!string || !string.length);

8

Ich habe einige Nachforschungen angestellt, was passiert, wenn Sie einer Testerfunktion einen Wert ohne Zeichenfolge und ohne Leerzeichen / Null übergeben. Wie viele wissen, ist (0 == "") in JavaScript wahr, aber da 0 ein Wert ist und nicht leer oder null, möchten Sie ihn möglicherweise testen.

Die folgenden zwei Funktionen geben true nur für undefinierte Werte, null, leere Werte / Leerzeichen und false für alles andere zurück, z. B. Zahlen, Boolesche Werte, Objekte, Ausdrücke usw.

function IsNullOrEmpty(value)
{
    return (value == null || value === "");
}
function IsNullOrWhiteSpace(value)
{
    return (value == null || !/\S/.test(value));
}

Es gibt kompliziertere Beispiele, die jedoch einfach sind und konsistente Ergebnisse liefern. Es besteht keine Notwendigkeit, auf undefiniert zu testen, da es in der Prüfung (value == null) enthalten ist. Sie können das C # -Verhalten auch nachahmen, indem Sie sie wie folgt zu String hinzufügen:

String.IsNullOrEmpty = function (value) { ... }

Sie möchten es nicht in den Strings-Prototyp einfügen, da ein Fehler auftritt, wenn die Instanz der String-Klasse null ist:

String.prototype.IsNullOrEmpty = function (value) { ... }
var myvar = null;
if (1 == 2) { myvar = "OK"; } // Could be set
myvar.IsNullOrEmpty(); // Throws error

Ich habe mit dem folgenden Wertearray getestet. Sie können es durchlaufen, um Ihre Funktionen im Zweifelsfall zu testen.

// Helper items
var MyClass = function (b) { this.a = "Hello World!"; this.b = b; };
MyClass.prototype.hello = function () { if (this.b == null) { alert(this.a); } else { alert(this.b); } };
var z;
var arr = [
// 0: Explanation for printing, 1: actual value
    ['undefined', undefined],
    ['(var) z', z],
    ['null', null],
    ['empty', ''],
    ['space', ' '],
    ['tab', '\t'],
    ['newline', '\n'],
    ['carriage return', '\r'],
    ['"\\r\\n"', '\r\n'],
    ['"\\n\\r"', '\n\r'],
    ['" \\t \\n "', ' \t \n '],
    ['" txt \\t test \\n"', ' txt \t test \n'],
    ['"txt"', "txt"],
    ['"undefined"', 'undefined'],
    ['"null"', 'null'],
    ['"0"', '0'],
    ['"1"', '1'],
    ['"1.5"', '1.5'],
    ['"1,5"', '1,5'], // Valid number in some locales, not in JavaScript
    ['comma', ','],
    ['dot', '.'],
    ['".5"', '.5'],
    ['0', 0],
    ['0.0', 0.0],
    ['1', 1],
    ['1.5', 1.5],
    ['NaN', NaN],
    ['/\S/', /\S/],
    ['true', true],
    ['false', false],
    ['function, returns true', function () { return true; } ],
    ['function, returns false', function () { return false; } ],
    ['function, returns null', function () { return null; } ],
    ['function, returns string', function () { return "test"; } ],
    ['function, returns undefined', function () { } ],
    ['MyClass', MyClass],
    ['new MyClass', new MyClass()],
    ['empty object', {}],
    ['non-empty object', { a: "a", match: "bogus", test: "bogus"}],
    ['object with toString: string', { a: "a", match: "bogus", test: "bogus", toString: function () { return "test"; } }],
    ['object with toString: null', { a: "a", match: "bogus", test: "bogus", toString: function () { return null; } }]
];

Wenn Sie einfach aufhören, == zu verwenden und === verwenden, löst dies das Problem, wenn (s === "").
Scott Marcus

8

So überprüfen Sie, ob es sich genau um eine leere Zeichenfolge handelt:

if(val==="")...

So überprüfen Sie, ob es sich um eine leere Zeichenfolge ODER ein logisches Äquivalent für No-Value handelt (null, undefiniert, 0, NaN, false, ...):

if(!val)...

7

Es gibt keine isEmpty()Methode, Sie müssen nach Typ und Länge suchen:

if (typeof test === 'string' && test.length === 0){
  ...

Die Typprüfung ist erforderlich , um Laufzeitfehler zu vermeiden , wenn testist undefinedoder null.


7

Wenn Sie Leerzeichenfolgen ignorieren, können Sie damit nach null, leer und undefiniert suchen:

var obj = {};
(!!obj.str) // Returns false

obj.str = "";
(!!obj.str) // Returns false

obj.str = null;
(!!obj.str) // Returns false

Es ist prägnant und funktioniert für undefinierte Eigenschaften, obwohl es nicht am besten lesbar ist.

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.