La forma más fácil de verificar si la cadena es nula o vacía

87

Tengo este código que busca la cadena vacía o nula. Está funcionando en pruebas.

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

Lo que me pregunto es si hay una mejor manera que not email? or email is ''. ¿Puedo hacer el equivalente de C # string.IsNullOrEmpty(arg)en CoffeeScript con una sola llamada? Siempre pude definir una función para él (como lo hice) pero me pregunto si hay algo en el idioma que me falta.

jcollum
fuente

Respuestas:

118

Sip:

passwordNotEmpty = not not password

o más corto:

passwordNotEmpty = !!password
thejh
fuente
1
Esta es la más "javascript-y" de las dos respuestas. Particularmente si usa la !!versión, que es una forma común de convertir esencialmente a booleano. Si importa, es casi seguro que es más rápido que definir una función como sugirió Jeremy.
Aaron Dufour
Todos funcionan, pero este obtuvo el mayor número de votos a favor. Aunque me gusta stackoverflow.com/q/8127920/30946 para facilitar la lectura.
jcollum
3
Se produce un error de cadena con todos los espacios ... por lo que no funciona para el blanco
Arkhitech
1
@Arkhitech en blanco no es lo mismo que vacío, por lo que funciona.
jcollum
2
Demasiado "inteligente" para mi gusto en legibilidad; No creo que lo use, pero buen trabajo
PandaWood
37

No es completamente equivalente, pero email?.lengthsolo será veraz si emailno es nulo y tiene una .lengthpropiedad distinta de cero . Si tunot este valor, el resultado debería comportarse como desee tanto para cadenas como para matrices.

Si emailtiene nullo no un .length, entonces email?.lengthevaluará a null, que es falso. Si tiene un .length, este valor se evaluará según su longitud, que será falso si está vacío.

Su función podría implementarse como:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)
Jeremy
fuente
1
@pyrotechnick La pregunta no se refería a distinguir Arrays de Strings. Preguntó sobre la distinción de valores nulos y cadenas vacías de cadenas no vacías. Mi punto era que el código también podía distinguir valores nulos y matrices vacías de matrices no vacías, pero eso estaba más allá del alcance de la pregunta.
Jeremy
Sin embargo, "anyStringEmpty" es un nombre incorrecto para el método que proporcionó.
pirotecnia
14

Este es un caso en el que la "veracidad" resulta útil. Ni siquiera necesitas definir una función para eso:

test1 = not (email and password)

¿Por qué funciona?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false
Ricardo Tomasi
fuente
1
Supongo que ya ha invocado .trim()el valor como parte de su lógica de validación. La respuesta es más sobre la sintaxis CS.
Ricardo Tomasi
5
unless email? and email
  console.log 'email is undefined, null or ""'

Primero verifique si el correo electrónico no está indefinido y no es nulo con el operador existencial, luego, si sabe que existe, la and emailparte solo devolverá falso si la cadena de correo electrónico está vacía.

linda maquina
fuente
3

Puede utilizar la operación coffeescript o =

s = ''    
s or= null
Campos de Duane
fuente
¡Qué asombroso! ¡Gracias!
swrobel
1

Si necesita verificar que el contenido es una cadena, no un nulo ni una matriz, use un tipo simple de comparación:

 if typeof email isnt "string"
Kevin Lamping
fuente
typeof email isnt "string"devuelve falso para ambos ''y'a'
jcollum
1

Aquí hay un jsfiddle que demuestra una forma muy fácil de hacer esto.

Básicamente, simplemente haces esto en javascript:

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

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

En coffescript:

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

Espero que esto ayude a alguien :)

Automatico
fuente
1

Creo que el signo de interrogación es la forma más fácil de llamar a una función en una cosa si existe.

por ejemplo

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

quieres obtener el color, pero solo si el coche existe ...

coffeescript:

 car?.color

se traduce en javascript:

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

se llama operador existencial http://coffeescript.org/documentation/docs/grammar.html#section-63

Blair Anderson
fuente
La cadena vacía devuelve verdadero para la verificación de existencia.
jcollum
1

Estoy bastante seguro de que la respuesta de @thejh fue lo suficientemente buena como para verificar la cadena vacía PERO, creo que con frecuencia debemos verificar que '¿Existe?' y luego debemos marcar '¿Está vacío? incluir cadena, matriz y objeto '

Esta es la forma abreviada de CoffeeScript para hacer esto.

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

Si mantenemos el orden de esta pregunta, se verificaría con este orden 1. ¿Existe? 2. ¿No es una cadena vacía? 3. ¿No es un objeto vacío?

por lo que no hubo ningún problema para todas las variables, incluso en el caso de que no existieran.

jungwon jin
fuente
0

En lugar de la respuesta aceptada passwordNotEmpty = !!password, puede usar

passwordNotEmpty = if password then true else false

Da el mismo resultado (la diferencia solo en la sintaxis).

En la primera columna hay un valor, en la segunda está el resultado de if value:

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