Я пытаюсь написать несколько условий в одном выражении "если" с помощью OR.
sudo code Я пытаюсь написать:
если статус пуст, перейдите, если статус "завершен" перемещается, если статус "не удался".
Это мой код:
if ((_.isEmpty($scope.status)) || ($scope.status != ('completed' || 'failed'))) {
return frameworkService.navigateTo('giftcardWelcome');
}
Проверка _.isEmpty работает, проверка состояния "завершена", но при проверке || для 'failed' он не выполняет этого.
Может кто-нибудь объяснить мне, почему и как правильно писать? Я знаю, что я мог бы написать расширенное выражение, но хотел бы получить чистый рефакторинга.
Выражение $scope.status != ('completed' || 'failed')
действительно работает так, как выглядит, оно выполняет логическое ИЛИ между 'completed'
и 'failed'
, а затем сравнивает результат этого выражения с $scope.status
.
Результат 'completed' || 'failed'
'completed' || 'failed'
будет 'completed'
, поэтому это означает, что ваше состояние действительно эквивалентно $scope.status != 'completed'
.
Если вы хотите удостовериться, что $scope.status
не равно ни одной строке, вам нужно явно сравнить каждую строку: ($scope.status != 'completed' && $scope.status != 'failed')
.
('completed' || 'failed')
=== 'completed'
- потому что, как работает javascript, вам нужно проверить равенство индивидуально...
Тебе понадобиться
|| ($scope.status != 'completed' && $scope.status != 'failed')
note &&
not ||
... потому что $scope.status != 'completed' || $scope.status != 'failed'
$scope.status != 'completed' || $scope.status != 'failed'
будет ВСЕГДА быть истинным - из-за логики
$scope.status != ('completed' || 'failed')
Это не делает то, что вы думаете. В JavaScript A || B
A || B
возвращает A
если он правдивый, иначе B
; поскольку 'completed'
является правдивым, это эквивалентно
$scope.status != 'completed'
Чтобы проверить, является ли $scope.status
одним из двух значений, вам нужно либо проверить, что оба явно различаются (note &&
, not ||
):
$scope.status != 'completed' && $scope.status != 'failed')
или проверить, что он не находится в наборе (или другом контейнере):
let endSet = new Set(['completed', 'failed']);
// ...
endSet.has($scope.status)
('completed' || 'failed')
==='completed'
- потому что именно так работает javascript - вам нужно проверять равенство индивидуально ...($scope.status != 'completed' && $scope.status != 'failed')
- заметьте&&
не||
... потому что$scope.status != 'completed' || $scope.status != 'failed'
ВСЕГДА будет верным - из-за логики