С помощью оператора If, как я могу пропустить проверяемую переменную, если ее свойство может быть неопределенным? - PullRequest
0 голосов
/ 06 февраля 2020

Я бы хотел иметь возможность пропустить проверку переменной, если свойство (.emailAddress) может быть неопределенным, но продолжить проверку остальных.

Например, я проверяю введенный адрес электронной почты, если это существующий контакт (адрес электронной почты) на странице.

if(inputEmail.length > 0 && inputEmail.indexOf('@') > 0 */ check that the input is not blank & is probably an email address.

  && inputEmail !== existingContact1.emailAddress
  && inputEmail !== existingContact2.emailAddress
  && inputEmail !== existingContact3.emailAddress
  && inputEmail !== existingContact3.emailAddress
)   {
// execute code
}

Моя проблема возникает, если .emailAddress не определен, так как вы не можете проверить undefined в операторе If. .emailAddress может быть любой комбинацией существующего контакта 1-4, который может быть неопределенным или нет.

  • не может проверить, следует ли читать, не может сравнивать неопределенное.

Я пытался использовать typeof, чтобы найти, не объявлен ли он, а не результаты, которые я ожидал.

&& typeof existingContact1 == "undefined" || typeof existingContact1.emailAddress == "undefined" && existingContact1.emailAddress !== inputEmail

Какие существуют разные подходы, позволяющие предотвратить и пропустить, если .emailAddress может быть неопределенным?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Замечательная вещь о javascript в том, что вы можете работать с undefined. Я настоятельно рекомендую все делать как можно проще. Давайте рассмотрим некоторые случаи:

  1. Вы можете буквально оценить с помощью оператора ===, если что-то равно undefined. ===, возвращает значение true, когда значения с обеих сторон равны по значению и type, то есть, как вы будете проверять, не определено ли значение самым явным образом.

  2. Вы можете использовать ленивую ложную проверку, которая на самом деле является тем, что я рекомендую. Использование !!x (или просто x в операторе If) приведет его к логическому значению и вернет true, если x - непустая строка и не undefined.

Я хочу добавить в качестве сноски, что я бы порекомендовал просто сохранить массив с именем emailsOnPage и затем проверить, находится ли input.email в массиве, вместо ручной проверки 4 условий.

Робин упомянул нечувствительность к регистру писем, и это легко сделать; просто используйте форму if(x.toLowerCase() == y.toLowerCase()).

0 голосов
/ 06 февраля 2020

попробуй подход как

var existingContact1 = { emailAddress: 'abc@zyz.com' }
var existingContact2 = { emailAddress: 'abc@zyz.com' }
var existingContact3 = { emailAddress: 'abc@zyz.com' }
var existingContact4 = { emailAddress: 'abc@zyz.com' }

if(inputEmail.length > 0 && inputEmail.indexOf('@') > 0 */ check that the input is not blank & is probably an email address.

  && [existingContact1, existingContact2, existingContact3, existingContact4]
        .map(({ emailAddress }) => emailAddress) // get existing emails 
        .filter(x => x) // remove falsy values if any
       .indexOf(inputEmail) > -1 // check if available
    )   {
    // execute code
    }
0 голосов
/ 06 февраля 2020

При программировании undefined & null оценивать / возвращать к ложному значению, поэтому отметьте это следующим образом

if(inputEmail && inputEmail.indexOf('@') > 0 */ check that the input is not blank & is probably an email address.

  && inputEmail !== existingContact1.emailAddress
  && inputEmail !== existingContact2.emailAddress
  && inputEmail !== existingContact3.emailAddress
  && inputEmail !== existingContact3.emailAddress
)   {
// execute code
}
...