分配给函数式编程的链式逻辑运算符
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';
})();
我正在尝试处理多个选项以最干净的方式填充变量内容。
最简单的情况是:
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';
})();