我正在尝试创建一个检查值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:如何在短路版本中返回true
或false
问题2:代码
val != "" && val != null ? count++ : count
如何省略else部分?
答案 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;
return
和throw
都以这种方式顽固,并且总是必须被打破,不能与其他选择性操作员混在一起。