OR ||的多个条件在'if'语句中JS

时间:2018-09-26 03:05:43

标签: javascript if-statement operators or-operator

我试图在一个带有OR的'if'语句中编写多个条件。

我要编写的sudo代码:

如果状态为空,请导航;如果状态为“已完成”,请导航;如果状态为“失败”,请导航。

到目前为止,这是我的代码:

   if ((_.isEmpty($scope.status)) || ($scope.status != ('completed' || 'failed'))) {
        return frameworkService.navigateTo('giftcardWelcome');
    }

_.isEmpty检查有效,检查状态是否为“完成”有效,但是在检查||时对于“失败”,它不会执行此操作。

有人可以向我解释为什么以及如何正确书写吗?我知道我可以写一个扩展的if语句,但是想要一种干净的重构方式。

3 个答案:

答案 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')