Jak mogę sprawdzić pusty / niezdefiniowany / zerowy ciąg w JavaScript?

2849

Widziałem to pytanie , ale nie widziałem konkretnego przykładu w JavaScript. Czy string.EmptyJavaScript jest dostępny w prosty sposób , czy jest to tylko sprawdzenie ""?

casademora
źródło
2
po prostu FYI, myślę, że najbardziej przydatne interfejsy API dla klasy String znajdują się w Mozilli i javascript . [elated.com] ( elated.com/articles/working-with-strings ) zawiera samouczek na temat wszystkich właściwości, metod, String'a ... Uwaga: link do Mozilli został zaktualizowany do developer.mozilla.org/en/ JavaScript / Reference / Global_Objects /…
Gene T
Sprawdź to: stackoverflow.com/a/36491147/7026966
Himanshu Shekhar
Pomogłoby to znacznie, gdyby wymóg był jasno określony. W przypadku jakich wartości wartość „Czy pusty” powinna być prawdziwa? Sprawdzanie, czy „” wskazuje, że powinien on zwracać wartość true tylko wtedy, gdy wartość wynosi Typ string i długość 0. Wiele odpowiedzi tutaj zakłada, że ​​powinien on również zwracać wartość true dla niektórych lub wszystkich wartości falsey.
RobG

Odpowiedzi:

3563

Jeśli chcesz tylko sprawdzić, czy jest jakaś wartość, możesz to zrobić

if (strValue) {
    //do something
}

Jeśli trzeba sprawdzić specjalnie dla pusty ciąg nad null, to myślę sprawdzaniu ""jest najlepszy, korzystając z ===operatora (tak, że wiesz, że to jest w rzeczywistości ciąg jesteś porównując przeciw).

if (strValue === "") {
    //...
}
bdukes
źródło
173
Testowanie właściwości length może być w rzeczywistości szybsze niż testowanie ciągu na „”, ponieważ interpreter nie będzie musiał tworzyć obiektu String z literału ciągu.
Vincent Robert
25
@Vincent robi naiwne profilowanie w narzędziach dla programistów Chrome, testowanie === ''vs .lengthnie wykazało zauważalnej poprawy (i używanie .lengthdziała tylko wtedy, gdy możesz założyć, że masz ciąg znaków)
bdukes
26
@ bdukes, kiedy zaczynasz dbać o tego rodzaju mikrooptymalizacje, nie sądzę, że Chrome jest przeglądarką, w której masz większość problemów z wydajnością ...
Vincent Robert
15
Uwaga: jeśli twoja definicja „pustego ciągu” zawiera spacje, to rozwiązanie nie jest odpowiednie. Ciąg 1 lub więcej spacji zwraca wartość true powyżej. Jeśli używasz JQuery, możesz po prostu użyć tego: if ($ .trim (ref) .length === 0) - zgodnie z odpowiedzią na podobne pytanie: stackoverflow.com/questions/2031085/…
CodeClimber
115
Zgodnie z oczekiwaniami .length > 0jest znacznie szybszy niż w porównaniu do literału łańcuchowego! Sprawdź to jsPerf
Chad
1128

Do sprawdzenia, czy łańcuch jest pusty, pusty lub niezdefiniowany, używam:

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

Do sprawdzenia, czy łańcuch jest pusty, zerowy lub niezdefiniowany, używam:

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

Aby sprawdzić, czy ciąg znaków jest pusty lub zawiera tylko białe znaki:

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};
Jano González
źródło
21
dlaczego 0 === str. długość zamiast str. długość === 0?
Vincent
66
@ Warunki Vincent są często pisane w ten sposób, if (variable == constant value)a jeśli zapomnisz „=”, zamiast testowania przypisujesz stałą wartość do zmiennej. Kod nadal będzie działał, ponieważ możesz przypisać zmienną w if. Bezpieczniejszym sposobem zapisania tego warunku jest odwrócenie stałej wartości i zmiennej. W ten sposób podczas testowania kodu zobaczysz błąd (niepoprawne przypisanie lewej strony). Możesz także użyć czegoś takiego jak JSHint, aby zabronić przypisywania w warunkach i być ostrzeżonym, gdy je napiszesz.
florian
2
wstyd, który /^\s*$/.test(str)tak naprawdę nie jest czytelny - może lepiej byłoby usunąć spacje za pomocą prostszego kodu lub wyrażenia regularnego? patrz stackoverflow.com/questions/6623231/… oraz stackoverflow.com/questions/10800355/…
Adrien Be
6
/^\s*$/.test(str) można zastąpić str.trim (). length === 0
Schadenfreude
21
@ Vincent nazywa się to również „Warunki Yoda”, jak if blue is the sky. Zobacz dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ.
316

Wszystkie poprzednie odpowiedzi są dobre, ale będzie jeszcze lepiej. Użyj operatora !!( nie ).

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

Lub użyj rzutowania typu:

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

Oba wykonują tę samą funkcję. Wpisz zmienną do Boolean, gdzie strjest zmienną.
Wraca falseza null,undefined,0,000,"",false.
Zwraca trueciąg „0” i białe znaki „”.

karthick.sk
źródło
61
Dlaczego to jest „jeszcze lepsze”?
Mene
33
Czy jest jakaś różnica między zachowaniem if(str)a if(!!str)?
Peter Olson,
6
@PeterOlson, jeśli próbujesz zapisać zmienną jako wartość logiczną, która sprawdza wiele ciągów znaków pod kątem zawartości, powinieneś to zrobić ... aka, var any = (!!str1 && !!str2 && !!str3)jeśli jest tam również liczba
John Ruddell
23
To jest rozwiązanie, którego zawsze używam. !!str.trim()aby upewnić się, że łańcuch nie jest utworzony tylko z białych znaków.
Dario Oddenino,
5
Nie wygląda to na hack, Boolean(str)jest o wiele bardziej czytelny i mniej „wtfish”.
shinzou,
105

Najbliższą rzeczą, jaką można uzyskać str.Empty(pod warunkiem, że str jest ciągiem znaków) jest:

if (!str.length) { ...
Ates Goral
źródło
8
Czy to nie wyrzuca wyjątku, że str jest zerowy?
Pic Mickael,
3
@PicMickael Tak! Tak też by było str.Empty.
Ates Goral
99

Jeśli musisz się upewnić, że ciąg nie jest tylko garstką pustych spacji (zakładam, że jest to do sprawdzania poprawności formularza), musisz wykonać zamianę na spacje.

if(str.replace(/\s/g,"") == ""){
}
Sugendran
źródło
8
Ale wykonuje to zadanie, jeśli to, co naprawdę chcesz przetestować, to ciąg znaków z zawartością spacji. Czy istnieje tańszy sposób na przetestowanie tego?
flash
4
A co z właściwością długości?
driAn
27
Zamiast usuwać wszystkie spacje, dlaczego nie sprawdzić, czy nie ma spacji? Ma 2 zalety, że może wcześnie wyskoczyć, jeśli występuje znak spacji, i nie zwraca nowego ciągu, który następnie sprawdzasz. if(str.match(/\S/g)){}
mpen
34
@ Mark FYI, nie potrzebujesz globalnego modyfikatora, ponieważ dopasowanie pierwszego wystąpienia znaku spacji oznaczałoby, że łańcuch nie jest pusty:str.match(/\S/)
neezer
1
dlaczego to jest drogie Jeśli tak, to dlaczego jQuery używa tej metody? Można to znaleźć w źródle jQueryvar trimLeft = /^\s+/, trimRight = /\s+$/;
Marecky
66

Używam:

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
Strumień
źródło
5
To rozwiązanie jest bardziej niezależne od języka. Jedyną funkcją JavaScript, na której polega, jest typeof. Jest to więc dobry przykład rozwiązania, którego można użyć, gdy nie ufasz implementacjom w różnych przeglądarkach i nie masz czasu na lepsze rozwiązanie. (IE, brak dostępu do Internetu). To coś w rodzaju dowodu. Nie najczystszy, ale możesz być pewien, że zadziała, nie wiedząc zbyt wiele o JavaScript.
Jeff Davis,
2
Poszedłbym jeszcze trochę dalej i przybiłbym go operatorem === dla nieokreślonej sprawy. W przeciwnym razie jest to po prostu idealna odpowiedź.
xarlymg89
typeofW switchnie działa dla mnie. Dodałem if (typeof e == "undefined")test i to działa. Dlaczego?
Lucas,
1
@Lucas Ponieważ była to literówka lub niedopatrzenie. Twoja modyfikacja jest poprawnym podejściem. (oryginał odnosi się do kontekstu pustej funkcji, a nie do parametru e, który ma sprawdzić funkcja)
beeThree
Czy możemy użyć case undefined:zamiast case typeof(e) == "undefined":?
Boris J.
43

Możesz użyć lodash : _.isEmpty (wartość).

Obejmuje ona wiele takich przypadkach {}, '', null, undefined, itd.

Ale ona zawsze wraca truedo Numberrodzaju JavaScript prymitywne typy danych , jak _.isEmpty(10)i _.isEmpty(Number.MAX_VALUE)obu zwrotów true.

Moshii
źródło
_.isEmpty(" "); // => false
Erich
1
@Erich Ponieważ " "nie jest pusty. _.isEmpty("");zwraca true.
Moshii
1
całkiem prawda - wspomniałem o tym, ponieważ kilka innych odpowiedzi tutaj sugeruje sprawdzanie poprawności formularzy i sprawdzanie, czy łańcuch składa się tylko z białych znaków, a ta pojedyncza funkcja lodash sama w sobie nie rozwiąże tego problemu.
Erich
@Erich, teraz rozumiem, dzięki za wzmiankę.
Moshii
36

Funkcjonować:

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: W JavaScript nie używaj podziału linii po return;

T.Todua
źródło
1
Czy masz szansę wyjaśnić, co robi każda kontrola? :)
DanV
2
-1 Testują różne rzeczy. Nie ma sensu umieszczać ich wszystkich w jednym ifstwierdzeniu.
Bennett McElwee
1
typeof MyVariable == 'undefined' nie rozróżnia zainicjowanej zmiennej o nieokreślonej wartości od niezadeklarowanej zmiennej, chyba że zmienna została początkowo zadeklarowana i zainicjowana na wartość null. Zaznaczenie właściwości length powoduje, że operacja pierwotna na łańcuchu jest zawijana w obiekt łańcucha.
Scott Marcus
35

Próbować:

if (str && str.trim().length) {  
    //...
}
Yang Dong
źródło
2
Czy właściwość length jest konieczna?
frogcoder
str.trim().lengthzrobię to szybciej niż str.trim()o około 1% według moich własnych wyników testów.
devildelta
2
@devildelta - Twój 1% to błąd w teście.
Stephen M. Irving,
OP chce przetestować na pusty ciąg, niezdefiniowany lub pusty. To jest testowanie łańcucha, który nie jest żadnym z tych warunków. Nie powiedział też nic o ciągach białych znaków. Za pomocą tego możesz testować warunki OP, o ile masz pewność, że w zmiennej nie są przechowywane żadne inne typy danych: if (!str) { ... }
Stephen M Irving
34
var s; // undefined
var s = ""; // ""
s.length // 0

W JavaScript nie ma nic reprezentującego pusty ciąg znaków. Wykonaj sprawdzenie przeciwko length(jeśli wiesz, że var zawsze będzie ciągiem) lub przeciwko""

cllpse
źródło
29

Nie martwiłbym się zbytnio najbardziej wydajną metodą. Użyj tego, co jest najbardziej jasne dla twojej intencji. Dla mnie to zwyklestrVar == "" .

Zgodnie z komentarzem Constantina , jeśli strVar mógłby w jakiś sposób zawierać wartość całkowitą 0, to rzeczywiście byłaby to jedna z tych sytuacji wyjaśniających zamiary.

Chris Noe
źródło
11
Kiepski pomysł. Sprawdzisz się, jeśli strVar zostanie przypadkowo przypisany 0.
Constantin
5
Zgadzam się, że wyjaśnienie twojego zamiaru jest ważniejsze niż jakiekolwiek mikrooptymalizacje, które mogłyby przynieść inne metody, ale lepiej byłoby użyć operatora ścisłego porównania === . Zwraca prawdę tylko wtedy, gdy strVarjest pustym ciągiem.
Bezużyteczny kod
Sprawdzenie kończy się niepowodzeniem, jeśli jest niezdefiniowane. Więc jeśli (str) działa lepiej
Valentin Heinitz
3
@ValentinHeinitz, jeśli str otrzyma wartość falsey równą 0 lub „0”, jeśli (str) fałszywie poda wartość true. Najlepszym podejściem jest if (str === ""). To proste i nigdy nie zawiedzie.
Scott Marcus
20

Wiele odpowiedzi i wiele różnych możliwości!

Bez wątpienia zwycięzcą jest szybkie i proste wdrożenie: if (!str.length) {...}

Jednak dostępnych jest wiele innych przykładów. Najlepsza funkcjonalna metoda na to, sugeruję:

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

To trochę przesada, wiem.

tfont
źródło
2
Sprawdzanie niezdefiniowanych musiałoby zostać przeniesione na pierwsze w czekach, inaczej niezdefiniowane elementy spowodują wyjątki od wcześniejszych czeków.
SvdSinner
Całkowicie się zgadzam! DOBRY CHWYT. Zmienię moją powyższą odpowiedź!
tfont
str.length === 0zwraca true dla każdej funkcji, która nie ma parametrów formalnych.
RobG
20

Możesz także użyć wyrażeń regularnych:

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

Sprawdza ciągi znaków, które są puste lub wypełnione białymi spacjami.

oem
źródło
Działa, ale jest też koszmarnie drogi. Dobrze, jeśli chcesz tylko sprawdzić jedną lub dwie rzeczy, a nie duży zestaw.
Orfeusz
19
  1. sprawdź, czy var a;istnieją
  2. przyciąć false spaces wartość, a następnie sprawdźemptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }
Timothy Nwanwene
źródło
19

Wydajność

Testy przeprowadzam na macOS 10.13.6 (High Sierra) dla 18 wybranych rozwiązań. Rozwiązania działają nieco inaczej (w przypadku danych wejściowych z narożników), co zostało przedstawione w poniższym fragmencie.

Wnioski

  • Rozwiązania oparte na prostych !str, ==, ===ilength jest szybki dla przeglądarki (A, B, C, G, I, J)
  • rozwiązania oparte na wyrażeniu regularnym ( test, replace) icharAt są najwolniejsze dla wszystkich przeglądarek (H, L, M, P)
  • rozwiązania oznaczone jako najszybsze były najszybsze tylko dla jednego przebiegu testowego - ale w wielu przebiegach zmienia się w grupie „szybkich” rozwiązań

Wpisz opis zdjęcia tutaj

Detale

W poniższym fragmencie porównuję wyniki wybranych 18 metod przy użyciu różnych parametrów wejściowych

  • "" "a" " "- pusty ciąg, ciąg z literą i ciąg ze spacją
  • [] {} f- tablica, obiekt i funkcja
  • 0 1 NaN Infinity - liczby
  • true false - Boolean
  • null undefined

Nie wszystkie przetestowane metody obsługują wszystkie przypadki wprowadzania danych.

A następnie dla wszystkich metod wykonuję przypadek testowy prędkości str = ""dla przeglądarek Chrome, Safari v13.0.4 v78.0.0 i Firefox v71.0.0 - można uruchomić testy na komputerze tutaj

Wpisz opis zdjęcia tutaj

Kamil Kiełczewski
źródło
To jest naprawdę niesamowite! Uwielbiam to wszystko układać! Dziękuję Ci!
WebWanderer
to dokładne studium - dzięki
Deian
17

Ponadto w przypadku, gdy uważasz ciąg wypełniony białymi znakami za „pusty”.

Możesz to przetestować za pomocą tego wyrażenia regularnego:

!/\S/.test(string); // Returns true if blank.
Wab_Z
źródło
14

Zwykle używam czegoś takiego,

if (!str.length) {
    // Do something
}
user2086641
źródło
3
Najszybszy, jeśli wiesz, że zmienna jest łańcuchem. Zgłasza błąd, jeśli zmienna jest niezdefiniowana.
Adrian Hope-Bailie
@ AdrianHope-Bailie dlaczego miałbyś testować niezdefiniowaną zmienną?
Abimael Martell
2
@AbimaelMartell Dlaczego nie? Masz zmienną, którą zadeklarowałeś lub która została ci przekazana z jakiegoś zakresu, nad którym nie masz kontroli, na przykład w odpowiedzi na wywołanie metody lub interfejsu API. Możesz założyć, że zawiera wartość i użyć powyższego wyboru, ale jeśli nie jest zdefiniowany lub ma wartość NULL, pojawi się błąd. var test = null; if (! test.length) {alert („Adrian się myli”);}
Adrian Hope-Bailie
OP poprosił o „jak sprawdzić pusty ciąg”, niezdefiniowana zmienna nie jest pustym ciągiem. W każdym razie możesz sprawdzić typeof variable != "undefined"przed sprawdzeniem, czy jest pusty.
Abimael Martell
10

Nie zauważyłem odpowiedzi, która uwzględnia możliwość wystąpienia pustych znaków w ciągu. Na przykład, jeśli mamy ciąg znaków o wartości zerowej:

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

Aby przetestować jego nieważność, można zrobić coś takiego:

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

Działa na łańcuch zerowy i na pusty łańcuch i jest dostępny dla wszystkich łańcuchów. Ponadto można go rozszerzyć, aby zawierał inne znaki JavaScript puste lub spacje (tj. Spację nierozdzielającą, znak kolejności bajtów, separator wierszy / akapitów itp.).

Bikush
źródło
2
Interesująca analiza. Nie sądzę, aby miało to znaczenie w 99,9% przypadków. ALE niedawno odkryłem, że MySQL ocenia kolumnę na „null”, jeśli (i tylko jeśli) ta kolumna zawiera znak null („\ 0”). Z drugiej strony Oracle nie oceniałoby „\ 0” jako pustego, woląc traktować go jako ciąg długości 1 (gdzie ten jeden znak jest pustym znakiem). Może to powodować nieporozumienia, jeśli nie zostanie odpowiednio rozwiązane, ponieważ wielu programistów stron internetowych pracuje z wewnętrzną bazą danych, która może przechodzić przez różne typy wartości „zerowych”. Powinien znajdować się w głowie każdego dewelopera.
cartbeforehorse
10

Tymczasem możemy mieć jedną funkcję, która sprawdza wszystkie „ puste ”, takie jak null, undefined, „”, „”, {}, [] . Właśnie to napisałem.

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

Zastosuj przypadki i wyniki.

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
źródło
10

W tej chwili nie ma bezpośredniej metody, takiej jak string.empty, aby sprawdzić, czy łańcuch jest pusty, czy nie. Ale w kodzie możesz użyć kontroli opakowania dla pustego ciągu, takiego jak:

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

}

Korzystając z tego, możesz również upewnić się, że łańcuch nie jest niezdefiniowany lub również zerowy. Pamiętaj, niezdefiniowane, puste i puste to trzy różne rzeczy.

Harshit Agarwal
źródło
Wyrzuciłby błąd na wartość zerową lub niezdefiniowaną, ponieważ nie powinniśmy bezpośrednio wykonywać operacji na zmiennej, która jest zerowa lub niezdefiniowana - przed wykonaniem tego sprawdź, czy istnieje str. = '', ale nie na let abc = '', te dwa są różne.
whoami
Zastanów się let rand = ()=>Math.random(), a następnie rand && rand.length > 0)zwraca false, ale wyraźnie fn nie jest „pusty”. Czyli zwraca false dla każdej funkcji, która nie ma parametrów formatu.
RobG
@RobG Math.random()zwraca liczbę, a nie ciąg znaków. Ta odpowiedź dotyczy ciągów znaków. ;-)
Harshit Agarwal
10

Wszystkie te odpowiedzi są miłe.

Ale nie mogę być pewien, że zmienna jest ciągiem, nie zawiera tylko spacji (jest to dla mnie ważne) i może zawierać „0” (ciąg).

Moja wersja:

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

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

Próbka na jsfiddle .

Andron
źródło
1
Co? Jeśli oczekujesz ciągu znaków empty(0)i empty(7)powinieneś zwrócić tę samą wartość.
Bennett McElwee
W moim szczególnym przypadku - empty("0")musi wrócić false(ponieważ nie jest to pusty ciąg), ale empty(0)musi wrócić, trueponieważ jest pusty :)
Andron
Ale 0 nie jest puste! Jest to liczba, a liczby nie mogą być pełne ani puste. Oczywiście jest to twoja funkcja i dlatego musi spełniać twoje wymagania, ale emptyw tym przypadku jest to nazwa wprowadzająca w błąd.
Bennett McElwee
Myślę, że ta nazwa emptyjest dobra. W dokumentach php dla pustej funkcji: Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.Różnica między PHPi tą funkcją - ten ciąg '0'nie zostanie zidentyfikowany jako pusty.
Andron
Jak mówię, to twoja funkcja: nazwij ją tak, jak chcesz. Ale emptyto niedokładne i mylące imię. Interesujące jest to, że PHP ma również źle nazwaną emptyfunkcję, ale błędy PHP nie mają nic wspólnego z JavaScript.
Bennett McElwee
10

Nie widziałem tutaj dobrej odpowiedzi (a przynajmniej takiej, która nie pasuje do mnie)

Postanowiłem więc odpowiedzieć sobie:

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

Musisz zacząć sprawdzać, czy jest niezdefiniowany. W przeciwnym razie twoja metoda może wybuchnąć, a następnie możesz sprawdzić, czy jest równa null lub jest równa pustemu ciągowi.

Nie możesz mieć !! lub tylko if(value)dlatego, że jeśli sprawdzisz 0, da ci fałszywą odpowiedź (0 to fałsz).

Powiedziawszy to, zawiń to w metodę taką jak:

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

PS .: Nie musisz sprawdzać typeof , ponieważ wybuchłby i rzuciłby jeszcze zanim wejdzie do metody

Davi Daniel Siepmann
źródło
Prawdopodobnie lepiej zastosować konstrukcję logiczną (wartość), która traktuje wartości niezdefiniowane i zerowe (a także 0, 0, fałsz, NaN) jako fałsz. Zobacz stackoverflow.com/questions/856324/...
Zhuravlev A.,
9

Jeśli trzeba wykryć nie tylko puste, ale i puste ciągi, dodam do odpowiedzi Górala:

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

function isBlank(s){
    return isEmpty(s.trim());    
}
Josef.B
źródło
8

Spróbuj tego

str.value.length == 0
Doug
źródło
3
"".value.lengthspowoduje błąd. Powinno byćstr.length === 0
AndFisher,
To trowuje TypeErrorIf strjest równe undefinedlubnull
RousseauAlexandre
8

Możesz łatwo dodać go do natywnego obiektu String w JavaScript i używać go w kółko ...
Coś prostego, takiego jak poniższy kod, może wykonać zadanie, jeśli chcesz sprawdzić ''puste ciągi:

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

W przeciwnym razie, jeśli chcesz sprawdzić zarówno ''pusty ciąg znaków, jak i ' 'spację, możesz to zrobić, dodając trim()coś w rodzaju kodu poniżej:

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

i możesz to tak nazwać:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false
Alireza
źródło
Jakie korzyści ma z tego robienie, !(!!this.length)a nie tylko !this(lub !this.trim()druga opcja)? Ciąg o zerowej długości jest już fałszem, nawiasy są zbędne, a trzykrotne negowanie jest dokładnie takie samo, jak jednokrotne zanegowanie.
John Montgomery
8

Spróbuj tego:

export const isEmpty = string => (!string || !string.length);
V1NNY
źródło
8

Zrobiłem kilka badań na temat tego, co się stanie, jeśli przekażesz wartość nie-łańcuchową i niepustą / zerową do funkcji testera. Jak wielu wie, (0 == "") jest prawdziwe w JavaScript, ale ponieważ 0 jest wartością, a nie pustą lub zerową, możesz chcieć ją przetestować.

Poniższe dwie funkcje zwracają wartość true tylko dla wartości niezdefiniowanych, pustych, pustych / białych i wartość false dla wszystkich innych elementów, takich jak liczby, wartości logiczne, obiekty, wyrażenia itp.

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

Istnieją bardziej skomplikowane przykłady, ale są one proste i dają spójne wyniki. Nie ma potrzeby testowania pod kątem niezdefiniowanej wartości, ponieważ jest ona uwzględniona w sprawdzaniu (wartość == null). Możesz także naśladować zachowanie C # , dodając je do ciągu w następujący sposób:

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

Nie chcesz umieszczać go w prototypie ciągów, ponieważ jeśli wystąpienie klasy String ma wartość NULL, wystąpi błąd:

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

Testowałem z poniższą tablicą wartości. Możesz go zapętlić, aby sprawdzić swoje funkcje w razie wątpliwości.

// 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
źródło
Jeśli po prostu przestaniesz używać == i użyjesz ===, to rozwiąże problem, jeśli (s === "").
Scott Marcus
8

Aby sprawdzić, czy jest to dokładnie pusty ciąg:

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

Aby sprawdzić, czy jest to pusty ciąg LUB logiczny odpowiednik braku wartości (null, undefined, 0, NaN, false, ...):

if(!val)...
Luca C.
źródło
7

Nie ma isEmpty()metody, musisz sprawdzić typ i długość:

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

Sprawdzanie typu jest potrzebne, aby uniknąć błędów w czasie wykonywania, gdy testjest undefinedlub null.

Agustí Sánchez
źródło
7

Ignorując ciągi białych znaków, możesz użyć tego do sprawdzenia pustych, pustych i niezdefiniowanych:

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

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

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

Jest zwięzły i działa dla nieokreślonych właściwości, chociaż nie jest najbardziej czytelny.

mricci
źródło