Der einfachste Weg zu überprüfen, ob die Zeichenfolge null oder leer ist


87

Ich habe diesen Code, der nach der leeren oder Null-Zeichenfolge sucht. Es funktioniert beim Testen.

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

Ich frage mich, ob es einen besseren Weg gibt als not email? or email is ''. Kann ich string.IsNullOrEmpty(arg)mit einem einzigen Aufruf das Äquivalent von C # in CoffeeScript ausführen? Ich könnte immer eine Funktion dafür definieren (wie ich es getan habe), aber ich frage mich, ob etwas in der Sprache fehlt.

Antworten:


118

Jep:

passwordNotEmpty = not not password

oder kürzer:

passwordNotEmpty = !!password

1
Dies ist die "Javascript-y" der beiden Antworten. Insbesondere, wenn Sie die !!Version verwenden, die eine übliche Methode ist, um im Wesentlichen in Boolesche Werte umzuwandeln. Wenn es darauf ankommt, ist dies mit ziemlicher Sicherheit schneller als die Definition einer Funktion, wie Jeremy vorgeschlagen hat.
Aaron Dufour

Sie alle arbeiten, aber dieser hat die meisten positiven Stimmen bekommen. Ich mag stackoverflow.com/q/8127920/30946 für die Lesbarkeit tho.
JCollum

3
Es schlägt für Zeichenfolge mit allen Leerzeichen fehl ... funktioniert also nicht für Leerzeichen
Arkhitech

1
@Arkhitech blank ist nicht dasselbe wie leer, also funktioniert es.
JCollum

2
Zu "klug" für meinen Geschmack an Lesbarkeit; Ich glaube nicht, dass ich es benutzen werde, aber gute Arbeit
PandaWood

37

Es ist nicht ganz gleichwertig, wird aber email?.lengthnur dann wahr sein, wenn emailes nicht null ist und eine .lengthEigenschaft ungleich null hat . Wenn Sie notdiesen Wert verwenden, sollte sich das Ergebnis sowohl für Zeichenfolgen als auch für Arrays wie gewünscht verhalten.

Wenn es eine emailgibt nulloder nicht .length, email?.lengthwird ausgewertet null, was falsch ist. Wenn es ein .lengthhat, wird dieser Wert auf seine Länge ausgewertet, was falsch ist, wenn es leer ist.

Ihre Funktion könnte wie folgt implementiert werden:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)

1
@pyrotechnick Bei der Frage ging es nicht darum, Arrays von Strings zu unterscheiden. Es wurde nach der Unterscheidung von Nullwerten und leeren Zeichenfolgen von nicht leeren Zeichenfolgen gefragt. Mein Punkt war, dass der Code auch Nullwerte und leere Arrays von nicht leeren Arrays unterscheiden konnte, aber das ging über den Rahmen der Frage hinaus.
Jeremy

Trotzdem ist "entweder StringEmpty" ein falscher Name für die von Ihnen angegebene Methode.
Pyrotechnik

14

Dies ist ein Fall, in dem "Wahrhaftigkeit" nützlich ist. Sie müssen dafür nicht einmal eine Funktion definieren:

test1 = not (email and password)

Warum funktioniert es?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false

1
Ich gehe davon aus, dass Sie .trim()den Wert bereits als Teil Ihrer Validierungslogik aufgerufen haben . Die Antwort bezieht sich mehr auf die CS-Syntax.
Ricardo Tomasi

5
unless email? and email
  console.log 'email is undefined, null or ""'

Überprüfen Sie zunächst, ob die E-Mail nicht undefiniert und mit dem existentiellen Operator nicht null ist. Wenn Sie wissen, dass sie existiert, gibt das and emailTeil nur dann false zurück, wenn die E-Mail-Zeichenfolge leer ist.


3

Sie können das Coffeescript oder die Operation = verwenden

s = ''    
s or= null

Wow, das ist großartig! Vielen Dank!
Swrobel

1

Wenn Sie überprüfen müssen, ob der Inhalt eine Zeichenfolge ist, nicht null und kein Array, verwenden Sie einen einfachen Vergleichstyp:

 if typeof email isnt "string"

typeof email isnt "string"gibt für beide ''und'a'
jcollum

1

Hier ist eine jsfiddle , die einen sehr einfachen Weg zeigt, dies zu tun.

Grundsätzlich tun Sie dies einfach mit Javascript:

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

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

In coffescript:

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

Hoffe das hilft jemandem :)


1

Ich denke, das Fragezeichen ist der einfachste Weg, eine Funktion für eine Sache aufzurufen, wenn die Sache existiert.

beispielsweise

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

Sie möchten die Farbe erhalten, aber nur, wenn das Auto existiert ...

Kaffeeskript:

 car?.color

übersetzt in Javascript:

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

Es wird als existenzieller Operator http://coffeescript.org/documentation/docs/grammar.html#section-63 bezeichnet


Leere Zeichenfolge gibt true für die Existenzprüfung zurück.
JCollum

1

Ich bin mir ziemlich sicher, dass die Antwort von @thejh gut genug war, um die leere Zeichenfolge zu überprüfen, ABER ich denke, wir müssen häufig überprüfen, ob sie existiert. und dann müssen wir überprüfen, ob es leer ist. Zeichenfolge, Array und Objekt einschließen '

Dies ist die kürzere Möglichkeit für CoffeeScript, dies zu tun.

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

Wenn wir diese Fragenreihenfolge beibehalten, wird dies durch diese Reihenfolge überprüft. 1. Existiert sie? 2. nicht leere Zeichenfolge? 3. nicht leeres Objekt?

Es gab also keine Probleme für alle Variablen, auch wenn sie nicht existierten.



0

Anstelle der akzeptierten Antwort können passwordNotEmpty = !!passwordSie verwenden

passwordNotEmpty = if password then true else false

Es gibt das gleiche Ergebnis (der Unterschied nur in der Syntax).

In der ersten Spalte steht ein Wert, in der zweiten das Ergebnis von if value:

0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
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.