Самый простой способ проверить, является ли строка нулевой или пустой

87

У меня есть этот код, который проверяет пустую или нулевую строку. Он работает в тестировании.

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

Мне интересно, есть ли способ лучше, чем not email? or email is ''. Могу ли я сделать эквивалент C # string.IsNullOrEmpty(arg)в CoffeeScript с помощью одного вызова? Я всегда мог определить для него функцию (как и я), но мне интересно, есть ли в языке что-то, чего мне не хватает.

Jcollum
источник

Ответы:

118

Ага:

passwordNotEmpty = not not password

или короче:

passwordNotEmpty = !!password
thejh
источник
1
Это более "javascript-y" из двух ответов. В частности, если вы используете !!версию, которая является обычным способом преобразования в логическое значение. Если это важно, это почти наверняка быстрее, чем определение функции, как предлагал Джереми.
Aaron Dufour
Все они работают, но этот набрал больше всего голосов. Мне нравится stackoverflow.com/q/8127920/30946 за удобочитаемость.
jcollum
3
Он не работает для строки со всеми пробелами ... поэтому не работает для пробела
Arkhitech
1
Бланк @Arkhitech - это не то же самое, что пустой, поэтому он работает.
jcollum
2
Слишком «умно» на мой вкус в удобочитаемости; не думаю, что я воспользуюсь им, но хорошая работа, тем не менее
PandaWood
37

Это не полностью эквивалентно, но email?.lengthбудет правдивым, только если не emailравно нулю и имеет ненулевое .lengthсвойство. Если вы notустановите это значение, результат должен вести себя так, как вы хотите, как для строк, так и для массивов.

Если emailесть nullили нет .length, тогда email?.lengthбудет оцениваться как null, что неверно. Если у него есть, .lengthтогда это значение будет оценивать его длину, которая будет ложной, если она пуста.

Ваша функция может быть реализована как:

eitherStringEmpty = (email, password) ->
  not (email?.length and password?.length)
Джереми
источник
1
@pyrotechnick Вопрос не касался различения массивов от строк. Он спросил, как отличить нулевые значения и пустые строки от непустых строк. Я хотел сказать, что код также может отличать нулевые значения и пустые массивы от непустых массивов, но это выходит за рамки вопроса.
Джереми
Тем не менее, "либоStringEmpty" - неправильное имя для предоставленного вами метода.
пиротехник
14

Это тот случай, когда «правдивость» пригодится. Для этого даже не нужно определять функцию:

test1 = not (email and password)

Почему это работает?

'0'       // true
'123abc'  // true
''        // false
null      // false
undefined // false
Рикардо Томази
источник
1
Я предполагаю, что вы уже вызывали .trim()значение как часть своей логики проверки. Ответ больше о синтаксисе CS.
Рикардо Томази
5
unless email? and email
  console.log 'email is undefined, null or ""'

Сначала проверьте, не является ли адрес электронной почты неопределенным и пустым с помощью экзистенциального оператора, тогда, если вы знаете, что он существует, and emailчасть вернет только false, если строка электронной почты пуста.

машина
источник
3

Вы можете использовать coffeescript или операцию =

s = ''    
s or= null
Дуэйн Филдс
источник
Вау, это потрясающе! Благодарность!
swrobel
1

Если вам нужно проверить, что содержимое является строкой, а не нулем и массивом, используйте простой тип сравнения:

 if typeof email isnt "string"
Кевин Лэмпинг
источник
typeof email isnt "string"возвращает false для обоих ''и'a'
jcollum
1

Вот jsfiddle, демонстрирующий очень простой способ сделать это.

В основном вы просто делаете это с помощью javascript:

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

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

В coffescript:

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

Надеюсь, это кому-то поможет :)

Automatico
источник
1

Я думаю, что вопросительный знак - это самый простой способ вызвать функцию для объекта, если он существует.

например

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

вы хотите получить цвет, но только если машина есть ...

coffeescript:

 car?.color

переводится на javascript:

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

он называется экзистенциальным оператором http://coffeescript.org/documentation/docs/grammar.html#section-63

Блэр Андерсон
источник
Пустая строка возвращает истину для проверки существования.
jcollum
1

Я почти уверен, что ответ @thejh был достаточно хорош, чтобы проверить пустую строку, НО, я думаю, что нам часто нужно проверять, существует ли это? а затем нам нужно проверить, пусто ли оно? включить строку, массив и объект '

Это самый короткий способ для CoffeeScript сделать это.

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

Если мы сохраним этот порядок вопросов, это будет проверяться в этом порядке 1. Существует ли он? 2. не пустая строка? 3. не пустой объект?

поэтому не было никаких проблем для всех переменных, даже если они не существовали.

Чонвон Джин
источник
0

Вместо принятого ответа passwordNotEmpty = !!passwordвы можете использовать

passwordNotEmpty = if password then true else false

Дает тот же результат (разница только в синтаксисе).

В первом столбце - значение, во втором - результат if value:

0 - false
5 - true
'string' - true
'' - false
[1, 2, 3] - true
[] - true
true - true
false - false
null - false
undefined - false
Евморов
источник