分配给函数式编程的链式逻辑运算符

Chained logical operator on asigment to functional programming

我正在尝试处理多个选项以最干净的方式填充变量内容。

最简单的情况是:

const value = foo.bar || 'Default';

当想添加条件时,我通常会这样做:

const value = foo.bar || (n > 10 ? n : 'Default');

可以重构为:

const value = foo.bar || (n > 10 && n) || 'Default';

我的疑惑是当有几个stage的时候,是不是可以这样复制或者用经典的conditional来解决

选项A(逻辑运算符)

const value = foo.bar
  || (n > 10 && n)
  || (n > 0 && 0)
  || 'Default';

选项 B(带三元条件)

const value = foo.bar
  || (n > 10 && n)
  || (n > 0 ? 0 : 'Default');

选项 C(经典条件)

let value;
if(foo.bar) {
  value = foo.bar;
} else if(n > 10) {
  value = n;
} else if(n > 0) {
  value = 0;
} else {
  value = 'Default';
}

不要滥用逻辑 &&|| 运算符作为条件。 (n > 0 && 0) || 'Default' 不符合您的预期,由于 0.

的虚假性,它总是计算为 'Default'

那就只剩下三元条件运算符了

const value = foo.bar
  ? foo.bar
  : n > 10
    ? n
    : n > 0
      ? 0
      : 'Default';

或等效的条件语句

let value;
if (foo.bar) {
  value = foo.bar;
} else if (n > 10) {
  value = n;
} else if (n > 0) {
  value = 0;
} else {
  value = 'Default';
}

(foo.bar || … 在这里工作,但在这种特殊情况下为了视觉一致性我会避免使用它。


为了完整起见,另一种选择是 IIFE;这样您仍然可以使用表达式初始化常量,但没有嵌套的条件运算符:

const value = (() => {
  if (foo.bar) return foo.bar;
  if (n > 10) return n;
  if (n > 0) return 0;
  return 'Default';
})();