Le moyen le plus simple de vérifier si la chaîne est nulle ou vide

87

J'ai ce code qui vérifie la chaîne vide ou nulle. Cela fonctionne dans les tests.

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

Ce que je me demande, c'est s'il existe un meilleur moyen que not email? or email is ''. Puis-je faire l'équivalent de C # string.IsNullOrEmpty(arg)dans CoffeeScript avec un seul appel? Je pourrais toujours définir une fonction pour cela (comme je l'ai fait) mais je me demande s'il y a quelque chose dans la langue qui me manque.

jcollum
la source

Réponses:

118

Ouaip:

passwordNotEmpty = not not password

ou plus court:

passwordNotEmpty = !!password
thejh
la source
1
C'est la plus "javascript-y" des deux réponses. Surtout si vous utilisez la !!version, qui est un moyen courant de convertir essentiellement en booléen. Si cela compte, c'est presque certainement plus rapide que de définir une fonction comme l'a suggéré Jeremy.
Aaron Dufour
Ils fonctionnent tous, mais celui-ci a obtenu le plus de votes positifs. J'aime stackoverflow.com/q/8127920/30946 pour plus de lisibilité.
jcollum
3
Cela échoue pour la chaîne avec tous les espaces ... donc ne fonctionne pas pour le blanc
Arkhitech
1
@Arkhitech vide n'est pas la même chose que vide, donc ça marche.
jcollum
2
Trop "intelligent" à mon goût de la lisibilité; Je ne pense pas que je vais l'utiliser, mais bon travail
quand
37

Ce n'est pas tout à fait équivalent, mais email?.lengthne sera vrai que s'il emailest non nul et a une .lengthpropriété non nulle . Si vous notutilisez cette valeur, le résultat doit se comporter comme vous le souhaitez pour les chaînes et les tableaux.

Si emailest nullou n'a pas de .length, alors email?.lengthévaluera à null, ce qui est faux. Si elle a un .lengthalors cette valeur évaluera à sa longueur, qui sera fausse si elle est vide.

Votre fonction pourrait être implémentée comme:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)
Les vies noires comptent
la source
1
@pyrotechnick La question ne portait pas sur la distinction entre les tableaux et les chaînes. Il a demandé comment distinguer les valeurs nulles et les chaînes vides des chaînes non vides. Mon point était que le code pouvait également distinguer les valeurs nulles et les tableaux vides des tableaux non vides, mais cela dépassait la portée de la question.
Black Lives Matter
Néanmoins, "eitherStringEmpty" est un nom incorrect pour la méthode que vous avez fournie.
pyrotechnick
14

C'est un cas où la «vérité» est utile. Vous n'avez même pas besoin de définir une fonction pour cela:

test1 = not (email and password)

Pourquoi ça marche?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false
Ricardo Tomasi
la source
1
Je suppose que vous avez déjà appelé .trim()la valeur dans le cadre de votre logique de validation. La réponse concerne davantage la syntaxe CS.
Ricardo Tomasi
5
unless email? and email
  console.log 'email is undefined, null or ""'

Vérifiez d'abord si l'email n'est pas indéfini et non nul avec l'opérateur existentiel, puis si vous savez qu'il existe, la and emailpartie ne retournera false que si la chaîne d'email est vide.

cutemachine
la source
3

Vous pouvez utiliser l'opération coffeescript ou =

s = ''    
s or= null
Champs Duane
la source
Wow, c'est incroyable! Merci!
swrobel le
1

Si vous avez besoin de vérifier que le contenu est une chaîne, non null et non un tableau, utilisez une simple comparaison de typeof:

 if typeof email isnt "string"
Kevin Lamping
la source
typeof email isnt "string"renvoie false pour les deux ''et'a'
jcollum
1

Voici un jsfiddle démontrant un moyen très simple de le faire.

Fondamentalement, vous faites simplement cela est javascript:

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

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

En résumé:

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

J'espère que cela aide quelqu'un :)

Automatico
la source
1

Je pense que le point d'interrogation est le moyen le plus simple d'appeler une fonction sur une chose si la chose existe.

par exemple

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

vous voulez obtenir la couleur, mais seulement si la voiture existe ...

coffeescript:

 car?.color

se traduit par javascript:

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

il s'appelle l'opérateur existentiel http://coffeescript.org/documentation/docs/grammar.html#section-63

Blair Anderson
la source
La chaîne vide renvoie true pour le contrôle d'existence.
jcollum
1

Je suis à peu près sûr que la réponse de @thejh était assez bonne pour vérifier la chaîne vide MAIS, je pense que nous devons souvent vérifier que "Existe-t-il?" et ensuite nous devons vérifier «Est-il vide? inclure une chaîne, un tableau et un objet '

C'est le moyen le plus court pour CoffeeScript de le faire.

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

Si nous gardons cet ordre des questions, cela serait vérifié par cet ordre 1. existe-t-il? 2. pas de chaîne vide? 3. objet pas vide?

il n'y avait donc aucun problème pour toutes les variables, même si elles n'existaient pas.

jungwon jin
la source
0

Sur la base de cette réponse concernant la vérification si une variable a une truthyvaleur ou non, vous n'avez besoin que d'une ligne:

result = !email or !password

et vous pouvez l'essayer par vous-même sur cette console Coffeescript en ligne

AbdelHady
la source
0

Au lieu de la réponse acceptée, passwordNotEmpty = !!passwordvous pouvez utiliser

passwordNotEmpty = if password then true else false

Il donne le même résultat (la différence uniquement dans la syntaxe).

Dans la première colonne se trouve une valeur, dans la seconde le résultat de if value:

0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
Evmorov
la source