Javascript短路if语句:如何返回true

时间:2018-01-30 04:59:46

标签: javascript

我正在尝试创建一个检查值null""

的函数

这是我到目前为止所做的(正在运作)

function notnull(values,success,failed){
var count = 0

$.each(values,function(index,val){
    console.log(val)
    val != "" && val != null ? count++ : count 
})
if(count == values.length){
    return true;
}else{
    console.log('false')
}
}

但是,如果我尝试短路第二个if语句,则会返回错误

function notnull(values,success,failed){
var count = 0

$.each(values,function(index,val){
    val != "" && val != null ? count++ : count
})(count == values.length) ? return true:console.log('false')
}

错误说

  

未捕获的SyntaxError:意外的令牌返回

问题1:如何在短路版本中返回truefalse

问题2:代码

val != "" && val != null ? count++ : count

如何省略else部分?

1 个答案:

答案 0 :(得分:2)

你的第二个例子有点乱,但如果我理解你的功能,你想要查看每个值并确保它们都不为空,对吧?

这是你原来的,清理了一下:

function notNull(values){
  let count = 0;

  $.each(values, function (index,val) {
    (val != "" && val != null) ? count++ : count 
  });

  return count == values.length; // returns true or false
}

您基本上会浏览每个值,如果它们不为空,则将它们计算在内;如果没有为null,则返回true(您的计数与数组相同)或false否则。

您使用的是jQuery等效的vanilla each()函数。它们的功能相同:它们将遍历数组中的每个条目。

您不能短路each()。相反,您需要使用some()every()。这些功能类似,但相反:

  • some() - 只要其回调返回 false ,就会继续循环播放。
  • every() - 只要其回调返回 true ,就会继续循环播放。

在您的情况下,您希望使用every()因为您希望浏览每个元素并确保它是某种东西(在您的情况下,不是null):

function notNull(values) {
  return values.every((value) => value != "" && value != null);
}

console.log(notNull([1,2,3]));
console.log(notNull([1,null,3]));

好多了。这将检查每个值。只要它们符合条件,它就会继续前进并最终返回true。如果找到匹配的那个,它将在那里短路并返回false

至于你的第二个问题,你怎么能忽略其中的“其他”部分:

val != "" && val != null ? count++ : count

使用ternary operator(?:),你不能。但是,您可以使用普通的布尔运算符:

val != "" && val != null && count++;

JavaScript会在第一个false处使该条件短路,因此如果其他两个位为真,它只会到达count++

在你的第二个例子中,我认为你正在尝试类似的事情:

condition ? return value : console.log('a')

这将是无效的语法。您只能在三元组中包含值。你可以这样做:

return condition ? value : otherValue;

如果你想要混合使用return,你必须将它作为两个单独的东西来做:

!condition && console.log(''); // log if false;
if (condition) return value;

returnthrow都以这种方式顽固,并且总是必须被打破,不能与其他选择性操作员混在一起。