Найпростіший спосіб перевірити, чи рядок є нульовим чи порожнім


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 одним дзвінком? Я завжди міг визначити для нього функцію (як це робив), але мені цікаво, чи є в мові щось, чого я не маю.

Відповіді:


118

Так:

passwordNotEmpty = not not password

або коротше:

passwordNotEmpty = !!password

1
Це більш "javascript-y" з двох відповідей. Зокрема, якщо ви використовуєте !!версію, яка є загальноприйнятим способом, по суті, передати логічну форму. Якщо це важливо, це майже напевно швидше, ніж визначення функції, як запропонував Джеремі.
Аарон Дюфур,

Всі вони працюють, але цей отримав найбільше голосів. Мені подобається stackoverflow.com/q/8127920/30946 для читабельності.
jcollum

3
Це не вдається для рядка з усіма пробілами ... тому не працює для порожнього
Arkhitech

1
@Arkhitech blank - це не те саме, що і empty, тому він працює.
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, якщо рядок електронної пошти порожній.



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"

Сподіваюся, це комусь допомагає :)


1

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

наприклад

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

ви хочете отримати колір, але лише якщо машина існує ...

coffeescript:

 car?.color

перекладається на javascript:

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

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


Порожній рядок повертає true для перевірки існування.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.