Несколько условий с OR || в «если» заявление JS

1

Я пытаюсь написать несколько условий в одном выражении "если" с помощью OR.

sudo code Я пытаюсь написать:

если статус пуст, перейдите, если статус "завершен" перемещается, если статус "не удался".

Это мой код:

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

Проверка _.isEmpty работает, проверка состояния "завершена", но при проверке || для 'failed' он не выполняет этого.

Может кто-нибудь объяснить мне, почему и как правильно писать? Я знаю, что я мог бы написать расширенное выражение, но хотел бы получить чистый рефакторинга.

  • 0
    ('completed' || 'failed') === 'completed' - потому что именно так работает javascript - вам нужно проверять равенство индивидуально ... ($scope.status != 'completed' && $scope.status != 'failed') - заметьте && не || ... потому что $scope.status != 'completed' || $scope.status != 'failed' ВСЕГДА будет верным - из-за логики
Теги:
if-statement
operators
or-operator

3 ответа

1
Лучший ответ

Выражение $scope.status != ('completed' || 'failed') действительно работает так, как выглядит, оно выполняет логическое ИЛИ между 'completed' и 'failed', а затем сравнивает результат этого выражения с $scope.status.

Результат 'completed' || 'failed' 'completed' || 'failed' будет 'completed', поэтому это означает, что ваше состояние действительно эквивалентно $scope.status != 'completed'.

Если вы хотите удостовериться, что $scope.status не равно ни одной строке, вам нужно явно сравнить каждую строку: ($scope.status != 'completed' && $scope.status != 'failed').

  • 0
    Да, я вижу это сейчас, после того, как ты это объяснил. Спасибо :)
2

('completed' || 'failed') === 'completed' - потому что, как работает javascript, вам нужно проверить равенство индивидуально...

Тебе понадобиться

|| ($scope.status != 'completed' &&  $scope.status != 'failed')

note && not ||... потому что $scope.status != 'completed' || $scope.status != 'failed' $scope.status != 'completed' || $scope.status != 'failed' будет ВСЕГДА быть истинным - из-за логики

  • 0
    Спасибо за ваш ответ и объяснение :)
1
$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)
  • 0
    Спасибо за ваш ответ и объяснение :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню