可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've got this code that checks for the empty or null string. It's working in testing.
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}"
What I'm wondering is if there's a better way than not email? or email is ''
. Can I do the equivalent of C# string.IsNullOrEmpty(arg)
in CoffeeScript with a single call? I could always define a function for it (like I did) but I'm wondering if there's something in the language that I'm missing.
回答1:
Yup:
passwordNotEmpty = not not password
or shorter:
passwordNotEmpty = !!password
回答2:
It isn't entirely equivalent, but email?.length
will only be truthy if email
is non-null and has a non-zero .length
property. If you not
this value the result should behave as you want for both strings and arrays.
If email
is null
or doesn't have a .length
, then email?.length
will evaluate to null
, which is falsey. If it does have a .length
then this value will evaluate to its length, which will be falsey if it's empty.
Your function could be implemented as:
eitherStringEmpty = (email, password) ->
not (email?.length and password?.length)
回答3:
This is a case where "truthiness" comes in handy. You don't even need to define a function for that:
test1 = not (email and password)
Why does it work?
'0' // true
'123abc' // true
'' // false
null // false
undefined // false
回答4:
unless email? and email
console.log 'email is undefined, null or ""'
First check if email is not undefined and not null with the existential operator, then if you know it exists the and email
part will only return false if the email string is empty.
回答5:
You can use the coffeescript or= operation
s = ''
s or= null
回答6:
If you need to check that the content is a string, not null and not an array, use a simple typeof comparison:
if typeof email isnt "string"
回答7:
Here is a jsfiddle demonstrating a very easy way of doing this.
Basicly you simply do this is 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"
Hope this helps someone :)
回答8:
I think the question mark is the easiest way to call a function on a thing if the thing exists.
for example
car = {
tires: 4,
color: 'blue'
}
you want to get the color, but only if the car exists...
coffeescript:
car?.color
translates to javascript:
if (car != null) {
car.color;
}
it is called the existential operator http://coffeescript.org/documentation/docs/grammar.html#section-63
回答9:
Based on this answer about checking if a variable has a truthy
value or not , you just need one line:
result = !email or !password
& you can try it for yourself on this online Coffeescript console
回答10:
Instead of the accepted answer passwordNotEmpty = !!password
you can use
passwordNotEmpty = if password then true else false
It gives the same result (the difference only in syntax).
In the first column is a value, in the second is the result of if value
:
0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
回答11:
I'm pretty sure @thejh 's answer was good enough to check empty string BUT,
I think we frequently need to check that 'Does it exist?' and then we need to check 'Is it empty? include string, array and object'
This is the shorten way for CoffeeScript to do this.
tmp? and !!tmp and !!Object.keys(tmp).length
If we keep this question order, that would be checked by this order
1. does it exist?
2. not empty string?
3. not empty object?
so there wasn't any problems for all variable even in the case of not existed.