Maneira mais fácil de verificar se a string é nula ou vazia

87

Eu tenho este código que verifica a string vazia ou nula. Está funcionando em testes.

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

O que estou me perguntando é se existe uma maneira melhor do que not email? or email is ''. Posso fazer o equivalente a C # string.IsNullOrEmpty(arg)em CoffeeScript com uma única chamada? Eu sempre poderia definir uma função para ele (como fiz), mas estou me perguntando se há algo na linguagem que estou perdendo.

Jcollum
fonte

Respostas:

118

Sim:

passwordNotEmpty = not not password

ou mais curto:

passwordNotEmpty = !!password
thejh
fonte
1
Esta é a mais "javascript-y" das duas respostas. Principalmente se você usar a !!versão, que é uma maneira comum de converter essencialmente em booleano. Se for importante, é quase certo que seja mais rápido do que definir uma função, como Jeremy sugeriu.
Aaron Dufour
Todos eles funcionam, mas este teve o maior número de votos positivos. Eu gosto de stackoverflow.com/q/8127920/30946 para facilitar a leitura.
jcollum de
3
Falha para string com todos os espaços ... então não funciona para espaço em branco
Arkhitech
1
@Arkhitech blank não é a mesma coisa que vazio, então funciona.
jcollum
2
Muito "inteligente" para meu gosto em legibilidade; não acho que vou usá-lo, mas bom trabalho
PandaWood
37

Não é totalmente equivalente, mas email?.lengthsó será verdadeiro se emailnão for nulo e tiver uma .lengthpropriedade diferente de zero . Se você notusar esse valor, o resultado deve se comportar como você deseja para strings e arrays.

Se emailfor nullou não tiver um .length, email?.lengthserá avaliado como null, que é falsey. Se tiver um, .lengthentão este valor será avaliado como seu comprimento, que será falso se estiver vazio.

Sua função pode ser implementada como:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)
Black Lives Matter
fonte
1
@pyrotechnick A pergunta não era sobre como distinguir Arrays de Strings. Ele perguntou sobre a distinção de valores nulos e strings vazias de strings não vazias. Meu ponto é que o código também pode distinguir valores nulos e arrays vazios de arrays não vazios, mas isso estava além do escopo da questão.
Black Lives Matter
No entanto, "qualquerStringEmpty" é um nome incorreto para o método fornecido.
pirotecnia de
14

Este é um caso em que "veracidade" é útil. Você nem precisa definir uma função para isso:

test1 = not (email and password)

Por que isso funciona?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false
Ricardo Tomasi
fonte
1
Eu suponho que você já chamado .trim()sobre o valor como parte de sua lógica de validação. A resposta é mais sobre a sintaxe CS.
Ricardo Tomasi
5
unless email? and email
  console.log 'email is undefined, null or ""'

Primeiro verifique se o email não é indefinido e não nulo com o operador existencial, então se você souber que ele existe, a and emailparte retornará falso apenas se a string do email estiver vazia.

máquina fofa
fonte
3

Você pode usar a operação coffeescript ou =

s = ''    
s or= null
Duane Fields
fonte
Uau, isso é incrível! Obrigado!
swrobel de
1

Se você precisar verificar se o conteúdo é uma string, não nula e nem uma matriz, use um tipo de comparação simples:

 if typeof email isnt "string"
Kevin lamping
fonte
typeof email isnt "string"retorna falso para ambos ''e'a'
jcollum
1

Aqui está um jsfiddle demonstrando uma maneira muito fácil de fazer isso.

Basicamente, você simplesmente faz isso em 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"

Espero que isso ajude alguém :)

Automatico
fonte
1

Acho que o ponto de interrogação é a maneira mais fácil de chamar uma função em uma coisa se a coisa existir.

por exemplo

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

você quer pegar a cor, mas só se o carro existir ...

coffeescript:

 car?.color

traduz para javascript:

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

é chamado de operador existencial http://coffeescript.org/documentation/docs/grammar.html#section-63

Blair Anderson
fonte
A string vazia retorna verdadeiro para verificação de existência.
jcollum
1

Tenho certeza de que a resposta de @thejh foi boa o suficiente para verificar a string vazia, MAS, acho que frequentemente precisamos verificar se 'Isso existe?' e então precisamos verificar 'Está vazio? incluem string, array e objeto '

Esta é a maneira abreviada de CoffeeScript fazer isso.

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

Se mantivermos esta ordem de perguntas, isso seria verificado por esta ordem 1. ela existe? 2. string não vazia? 3. objeto não vazio?

então não houve problemas para todas as variáveis ​​mesmo no caso de não existir.

jungwon jin
fonte
0

Com base nesta resposta sobre como verificar se uma variável tem um truthyvalor ou não, você só precisa de uma linha:

result = !email or !password

E você pode tentar por si mesmo neste console Coffeescript online

AbdelHady
fonte
0

Em vez da resposta aceita, passwordNotEmpty = !!passwordvocê pode usar

passwordNotEmpty = if password then true else false

Ele dá o mesmo resultado (a diferença apenas na sintaxe).

Na primeira coluna está um valor, na segunda está o 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
fonte