Что не так с этим оператором 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);
}
Используя какой образец ввода для [val1, val2]
вы ожидаете, что он войдет в if
. Потому что на самом деле для val1 = "foo", val2 = "bar"
я получаю вывод консоли.
val1 — «категория», а val2 — «медицинская», ожидаемый результат должен быть «медицинская категория».
Ваше условие всегда будет true
, потому что у вас не может быть переменной, которая является пустой строкой и null
одновременно.
Условие 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 benull
or it cannot beempty
.
Пока один из них оценивается как true
, он войдет в if statement
. Поскольку empty string
не равно null
, проверка null
равна true
, что означает, что одна из проверок оценена как true
и войдет в if statement
. Если бы было наоборот, то empty string
оценивалось бы как true
и снова попадало бы в if statement
.
Это имело бы больше смысла, если бы вы проверяли равенство и тогда читались бы следующим образом:
Val
can benull
or it can beempty
.
Однако это не то, что вы ищете, поэтому вы хотите сказать следующее:
Val
cannot benull
AND it cannot beempty
.
&&
.||
.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 && теперь работает как положено.
Как упоминалось в других ответах, такое выражение (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]);
}
||
должны быть&&