Проверка нулевых и пустых значений в javascript

Что не так с этим оператором if? Если я передам не пустые значения, я все равно не попаду в блок if

И val1, и val2 имеют значения:

let val1 = 'category'
let val2 = 'medical'

if ((val1 !== null || val1 !== '') && (val2 !== null || val2 !== '')) {

  console.info(val1, val2);
}

val1 пусто, а val2 имеет значение:

let val1 = ''
let val2 = 'medical'

if ((val1 !== null || val1 !== '') && (val2 !== null || val2 !== '')) {

  console.info(val1, val2);
}

|| должны быть &&

Get Off My Lawn 30.05.2019 17:46

Используя какой образец ввода для [val1, val2] вы ожидаете, что он войдет в if. Потому что на самом деле для val1 = "foo", val2 = "bar" я получаю вывод консоли.

Shidersz 30.05.2019 17:51

val1 — «категория», а val2 — «медицинская», ожидаемый результат должен быть «медицинская категория».

Riley Christian 30.05.2019 17:51

Ваше условие всегда будет true, потому что у вас не может быть переменной, которая является пустой строкой и null одновременно.

Titus 30.05.2019 17:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
66
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Условие val1 !== null || val1 !== '' или val2 !== null && val2 !== '' всегда будет true

Говорят, что val1 не равно null или пустой строке. Подумайте, будет ли его null другая часть автоматически true и наоборот.

Вы должны использовать && вместо ||

var val1 = 'a'
var val2 = ''
if ((val1 !== null && val1 !== '') && (val2 !== null && val2 !== '')){
    console.info(val1, val2);
}

Чистый код может быть достигнут с помощью every() и includes()

var val1 = 'a'
var val2 = ''
if ([val1, val2].every(x => ![null,''].includes(x))){
    console.info(val1, val2);
}
Ответ принят как подходящий

Вы хотите использовать &&, а не ||, потому что сейчас вы говорите:

Val cannot be null or it cannot be empty.

Пока один из них оценивается как true, он войдет в if statement. Поскольку empty string не равно null, проверка null равна true, что означает, что одна из проверок оценена как true и войдет в if statement. Если бы было наоборот, то empty string оценивалось бы как true и снова попадало бы в if statement.

Это имело бы больше смысла, если бы вы проверяли равенство и тогда читались бы следующим образом:

Val can be null or it can be empty.

Однако это не то, что вы ищете, поэтому вы хотите сказать следующее:

Val cannot be nullAND it cannot be empty.

  • При проверке одной переменной на несколько значений не равный используйте проверку &&.
  • При проверке одной переменной на равный одно из нескольких значений используйте проверку ||.

let val1 = 'category'
let val2 = 'medical'

if ((val1 !== null && val1 !== '') && (val2 !== null && val2 !== '')) {
  console.info(val1, val2);
}

val1 = ''

if ((val1 !== null && val1 !== '') && (val2 !== null && val2 !== '')) {
  console.info(val1, val2);
}

Вам нужно изменить || на && в вашем выражении if.

let val1 = 'category'
let val2 = 'medical'

if ((val1 !== null && val1 !== '') && (val2 !== null && val2 !== '')) {

  console.info(val1, val2);
}

let val1 = ''
let val2 = 'medical'

if ((val1 !== null && val1 !== '') && (val2 !== null && val2 !== '')) {

  console.info(val1, val2);
}

Это должно решить вашу проблему.

Спасибо, вилки, я изменил || to && теперь работает как положено.

Riley Christian 30.05.2019 18:09

Как упоминалось в других ответах, такое выражение (val1 !== null || val1 !== '') необходимо изменить на (val1 !== null && val1 !== ''), иначе условие будет true для val1 = null или val1 = '', например:

  • Предположим, что val1 = null, тогда (val1 !== null || val1 !== '') будет оцениваться как (null !== null || null !== ''), и в результате (false || true) будет равно true.

Теперь для вашего конкретного случая вы можете создать метод, который возвращает true, когда вы считаете, что переменная равна "defined" (вы также можете проверить undefined), и сделать что-то вроде этого:

function _isDefined(val)
{
    return ![null, undefined, ""].includes(val);
}

let tests = [
  ["category", "medical"],
  ["category", null],
  [undefined, "medical"],
  ["", null],
  ["something", ""]
];

tests.forEach(function(test)
{
    let [val1, val2] = test;

    if (_isDefined(val1) && _isDefined(val2))
        console.info(val1, val2);
});
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Просто скажи if. Например:

var x = "";
var y = null;
var z;
var argArray = [x,y,z];

function hasValue(arg){
  if (arg){
    console.info("arg has some value"); 
  } else {
    console.info("arg has no value and is " + arg); 
  }
}

for (var i = 0; i < argArray.length; i++) {
  hasValue(argArray[i]);
}

Другие вопросы по теме