Najłatwiejszy sposób sprawdzenia, czy string jest pusty czy też pusty

87

Mam ten kod, który sprawdza pusty lub pusty ciąg. Działa na testach.

eitherStringEmpty= (email, password) ->
  emailEmpty = not email? or email is ''
  passwordEmpty = not password? or password is ''
  eitherEmpty = emailEmpty || passwordEmpty         

test1 = eitherStringEmpty "A", "B" # expect false
test2 = eitherStringEmpty "", "b" # expect true
test3 = eitherStringEmpty "", "" # expect true
alert "test1: #{test1} test2: #{test2} test3: #{test3}"

Zastanawiam się, czy istnieje lepszy sposób niż not email? or email is ''. Czy mogę wykonać odpowiednik C # string.IsNullOrEmpty(arg)w CoffeeScript za pomocą jednego wywołania? Zawsze mógłbym zdefiniować dla niego funkcję (tak jak zrobiłem), ale zastanawiam się, czy jest coś w języku, którego mi brakuje.

jcollum
źródło

Odpowiedzi:

118

Tak:

passwordNotEmpty = not not password

lub krócej:

passwordNotEmpty = !!password
thejh
źródło
1
To jest bardziej „javascript-y” z dwóch odpowiedzi. Szczególnie jeśli używasz !!wersji, która jest powszechnym sposobem rzutowania na wartość logiczną. Jeśli ma to znaczenie, jest to prawie na pewno szybsze niż definiowanie funkcji, jak zasugerował Jeremy.
Aaron Dufour,
Wszyscy działają, ale ten otrzymał najwięcej głosów pozytywnych. Podoba mi się stackoverflow.com/q/8127920/30946 ze względu na czytelność.
jcollum
3
Nie udaje się w przypadku ciągu znaków ze wszystkimi spacjami ... więc nie działa w przypadku pustego
Arkhitech
1
@Arkhitech blank to nie to samo, co puste, więc działa.
jcollum
2
Za "sprytny" jak na mój gust w czytelności; nie sądzę, żebym go użył, ale dobra robota
PandaWood
37

Nie jest to całkowicie równoważne, ale email?.lengthbędzie prawdziwe tylko wtedy, gdy emailnie jest zerowe i ma .lengthwłaściwość niezerową . Jeśli ustawisz nottę wartość, wynik powinien zachowywać się tak, jak chcesz, zarówno dla łańcuchów, jak i tablic.

Jeśli emailjest nulllub nie ma .length, to email?.lengthoszacuje do null, co jest błędem. Jeśli tak, .lengthto ta wartość zostanie oszacowana na długość, która będzie błędna, jeśli jest pusta.

Twoja funkcja może zostać zaimplementowana jako:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)
Jeremy
źródło
1
@pyrotechnick Pytanie nie dotyczyło odróżniania tablic od ciągów. Poprosił o odróżnienie wartości null i pustych łańcuchów od niepustych łańcuchów. Chodziło mi o to, że kod mógł również rozróżniać wartości null i puste tablice od niepustych tablic, ale to wykraczało poza zakres pytania.
Jeremy
Niemniej jednak „bothStringEmpty” to niepoprawna nazwa podanej metody.
pirotechnika
14

To przypadek, w którym przydaje się „prawdziwość”. Nie musisz nawet definiować funkcji do tego:

test1 = not (email and password)

Dlaczego to działa?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false
Ricardo Tomasi
źródło
1
Zakładam, że już wywołałeś .trim()tę wartość jako część logiki walidacji. Odpowiedź dotyczy bardziej składni CS.
Ricardo Tomasi
5
unless email? and email
  console.log 'email is undefined, null or ""'

Najpierw sprawdź, czy adres e-mail nie jest niezdefiniowany i nie ma wartości null za pomocą operatora egzystencjalnego, a następnie, jeśli wiesz, że istnieje, and emailczęść zwróci fałsz tylko wtedy, gdy ciąg wiadomości e-mail jest pusty.

cutemachine
źródło
3

Możesz użyć operacji coffeescript lub =

s = ''    
s or= null
Duane Fields
źródło
Wow, to jest niesamowite! Dzięki!
swrobel
1

Jeśli chcesz sprawdzić, czy zawartość jest ciągiem, a nie wartością null i nie tablicą, użyj prostego typu porównania:

 if typeof email isnt "string"
Kevin Lamping
źródło
typeof email isnt "string"zwraca wartość false dla obu ''i'a'
jcollum
1

Oto jsfiddle demonstrujący bardzo łatwy sposób na zrobienie tego.

Po prostu robisz to po prostu javascript:

var email="oranste";
var password="i";

if(!(email && password)){
    alert("One or both not set");        
}
else{
    alert("Both set");   
}

W coffescript:

email = "oranste"
password = "i"
unless email and password
  alert "One or both not set"
else
  alert "Both set"

Mam nadzieję, że to komuś pomoże :)

Automatico
źródło
1

Myślę, że znak zapytania to najłatwiejszy sposób na wywołanie funkcji rzeczy, jeśli rzecz istnieje.

na przykład

car = {
  tires: 4,
  color: 'blue' 
}

chcesz uzyskać kolor, ale tylko jeśli samochód istnieje ...

coffeescript:

 car?.color

tłumaczy na javascript:

if (car != null) {
  car.color;
}

nazywa się operatorem egzystencjalnym http://coffeescript.org/documentation/docs/grammar.html#section-63

Blair Anderson
źródło
Pusty łańcuch zwraca prawdę do sprawdzenia istnienia.
jcollum
1

Jestem prawie pewien, że odpowiedź @thejh była wystarczająco dobra, aby sprawdzić pusty ciąg, ALE myślę, że często musimy sprawdzać, czy istnieje? a następnie musimy sprawdzić „Czy jest puste? dołącz ciąg, tablicę i obiekt ”

To jest najkrótszy sposób na zrobienie tego przez CoffeeScript.

tmp? and !!tmp and !!Object.keys(tmp).length

Jeśli zachowamy tę kolejność pytań, zostanie to sprawdzone w tej kolejności 1. Czy istnieje? 2. nie jest pusty ciąg? 3. nie jest pusty obiekt?

więc nie było żadnych problemów dla wszystkich zmiennych, nawet jeśli ich nie było.

jungwon jin
źródło
0

Na podstawie tej odpowiedzi dotyczącej sprawdzania, czy zmienna ma truthywartość, czy nie, potrzebujesz tylko jednej linii:

result = !email or !password

i możesz spróbować samemu na tej internetowej konsoli Coffeescript

AbdelHady
źródło
0

Zamiast zaakceptowanej odpowiedzi passwordNotEmpty = !!passwordmożesz użyć

passwordNotEmpty = if password then true else false

Daje ten sam wynik (różnica tylko w składni).

W pierwszej kolumnie jest wartość, w drugiej wynik if value:

0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
Evmorov
źródło