我试图在一个带有OR的'if'语句中编写多个条件。
我要编写的sudo代码:
如果状态为空,请导航;如果状态为“已完成”,请导航;如果状态为“失败”,请导航。
到目前为止,这是我的代码:
if ((_.isEmpty($scope.status)) || ($scope.status != ('completed' || 'failed'))) {
return frameworkService.navigateTo('giftcardWelcome');
}
_.isEmpty检查有效,检查状态是否为“完成”有效,但是在检查||时对于“失败”,它不会执行此操作。
有人可以向我解释为什么以及如何正确书写吗?我知道我可以写一个扩展的if语句,但是想要一种干净的重构方式。
答案 0 :(得分:2)
('completed' || 'failed')
=== 'completed'
-因为这就是JavaScript的工作方式-您需要单独检查相等性...
您需要
|| ($scope.status != 'completed' && $scope.status != 'failed')
请注意&&
而不是||
...因为$scope.status != 'completed' || $scope.status != 'failed'
总是正确的-因为逻辑
答案 1 :(得分:1)
$scope.status != ('completed' || 'failed')
这没有做您认为做的事。在JavaScript中,A || B
如果正确,则返回A
,否则返回B
;由于'completed'
是真实的,因此等效于
$scope.status != 'completed'
要检查$scope.status
是否为两个值之一,您需要检查两个值是否明确不同(请注意&&
,而不是||
):
$scope.status != 'completed' && $scope.status != 'failed')
或测试它是否不在集合(或另一个容器)中:
let endSet = new Set(['completed', 'failed']);
// ...
endSet.has($scope.status)
答案 2 :(得分:1)
表达式$scope.status != ('completed' || 'failed')
看起来确实有效,它在'completed'
和'failed'
之间进行逻辑或运算,然后将该表达式的结果与$scope.status
进行比较。 / p>
'completed' || 'failed'
的结果将是'completed'
,这意味着您的条件实际上等于$scope.status != 'completed'
。
如果要确保$scope.status
不等于任何一个字符串,则需要明确地与每个字符串进行比较:($scope.status != 'completed' && $scope.status != 'failed')
。