我坚持严格的函数式编程原则,没有突变。
我如何以不改变 greeting
变量并且不在每个 if
block 中返回它的方式编写类似下面的代码?
const greet = (name, time) => {
let greeting = 'Morning';
if(time >= 12) {
greeting = 'Afternoon';
}
if(time >= 17) {
greeting = 'Evening';
}
return `Good ${greeting} ${name}!`;
};
如果只有两个条件我会执行以下操作,但是当有 3 个条件时它不会工作:
const greeting = time > 12 ? 'Afternoon' : 'Morning'
最佳答案
Ternary expressions可以组成其他三元表达式——允许我们对逻辑选择进行排序
const greeting = time > 12 ? (time > 17 ? 'Evening' : 'Afternoon') : 'Morning'
但是,我认为是变量让变量成为变量...
虽然你有两个的顾虑,但将它们分开会对你有好处
- 根据小时确定天数
- 组装问候语
通过这样做,您可以避免
- 突变(
greeting
的局部重新分配) - 单分支if语句
- 完全是命令式语句(即
let
、if
、return
、x = ...
)
结果是两个使用 表达式 编写的纯 ( referentially transparent ) 函数——没有赋值(或重新赋值),也没有副作用。
const timeToPeriod = time =>
time >= 17
? 'Evening'
: time >= 12
? 'Afternoon'
: 'Morning'
const greet = (name, time) =>
`Good ${timeToPeriod(time)} ${name} !`
console.log(greet('Jonas', 9)) // Good Morning Jonas !
console.log(greet('Jonas', 13)) // Good Afternoon Jonas !
console.log(greet('Jonas', 22)) // Good Evening Jonas !
关于javascript - 如何在没有突变的情况下分配条件变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45334143/