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 ""?

casademora
quelle
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
Überprüfen Sie dieses: stackoverflow.com/a/36491147/7026966
Himanshu Shekhar
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 === "") {
    //...
}
bdukes
quelle
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());
};
Jano González
quelle
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.

karthick.sk
quelle
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) { ...
Ates Goral
quelle
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,"") == ""){
}
Sugendran
quelle
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
Jet
quelle
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.

Moshii
quelle
_.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.

T.Todua
quelle
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) {  
    //...
}
Yang Dong
quelle
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""

cllpse
quelle
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.

Chris Noe
quelle
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ß.

tfont
quelle
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.

oem
quelle
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

Kamil Kiełczewski
quelle
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 
    }
Timothy Nwanwene
quelle
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.
Wab_Z
quelle
14

Ich benutze normalerweise so etwas,

if (!str.length) {
    // Do something
}
user2086641
quelle
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.).

Bikush
quelle
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
Imran Ahmad
quelle
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.

Harshit Agarwal
quelle
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 .

Andron
quelle
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

Davi Daniel Siepmann
quelle
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());    
}
Josef.B
quelle
8

Versuche dies

str.value.length == 0
Doug
quelle
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
Alireza
quelle
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);
V1NNY
quelle
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; } }]
];
JHM
quelle
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)...
Luca C.
quelle
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.

Agustí Sánchez
quelle
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.

mricci
quelle