Javascript ИЛИ выражение: вернуть операнд, который * не * NaN - PullRequest
2 голосов
/ 30 января 2020

У меня есть выражение OR, которое должно возвращать операнд, отличный от NaN:

(1 || NaN) // evaluates to 1 
(NaN || 1) // evaluates to 1

Но когда другой операнд также является ложным значением, таким как 0, null, undefined или false, Javascript всегда возвращает самый правый операнд:

(0 || NaN) // evaluates to NaN
(NaN || 0) // evaluates to 0
// same for combinations of 0, null, undefined and false

Есть ли способ соответствовать желаемому поведению "Вернуть операнд, который не NaN "в хорошее и короткое выражение или я должен полагаться на конструкцию if / else?

Ответы [ 4 ]

6 голосов
/ 30 января 2020

Вы можете добавить значение по умолчанию falsy в конце выражения, например

result = yourValue0 || yourValue1 || 0;

В этом случае вы получите либо истинное значение yourValueX или последнее ложное значение.

5 голосов
/ 30 января 2020

Попробуйте это:

var notNaN = [value1, value2, value3].find(item => !Number.isNaN(item))
5 голосов
/ 30 января 2020

Используйте выражение if-else, также известное как условный оператор:

!isNaN(a) ? a : b
1 голос
/ 30 января 2020

Операторы этого типа используют ленивый механизм для своих вычислений, и эта концепция называется коротким циклом в javascript. По сути, JS возвращает значение, как только он считает, что для вычисления этого выражения больше не требуется вычислений. Таким образом, если его оператор && вернется, как только он обнаружит первый неверный (0, "", null, undefined, NaN), как для оператора &&, если какой-либо из операндов неверный, нет проверки точки Операнды как выражение уже неверны, поэтому он возвращает это значение и завершает работу, теперь, если все операнды верны, он проверяет до последнего и возвращает последнее значение. Для || как раз наоборот, как только он находит первое истинное значение, которое он возвращает, в противном случае продолжает проверять до последнего и возвращает его.

...