如何在没有变异的情况下分配条件变量?

Jim*_*ody 4 javascript immutability ecmascript-6

我坚持严格的函数式编程原则,没有变异.

如何以不改变greeting变量的方式编写类似下面代码的内容,而不在每个if块中返回它?

const greet = (name, time) => { 
  let greeting = 'Morning';

  if(time >= 12) {
    greeting = 'Afternoon';
  }
  if(time >= 17) {
    greeting = 'Evening';
  }

  return `Good ${greeting} ${name}!`;
};
Run Code Online (Sandbox Code Playgroud)

如果只是两个条件我将执行以下操作,但是当有3个条件时它将不起作用:

const greeting = time > 12 ? 'Afternoon' : 'Morning'
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 11

三元表达式可以构成其他三元表达式 - 允许我们对逻辑选择进行排序

const greeting = time > 12 ? (time > 17 ? 'Evening' : 'Afternoon') : 'Morning'
Run Code Online (Sandbox Code Playgroud)

但是,我认为这是使变量成为变量变量 ......


但是你有两个问题,分开它们会对你有所帮助

  1. 确定从小时开始的日期
  2. 组装问候语字符串

通过这样做,你可以避免

  1. 突变(局部重新分配greeting)
  2. 单分支if语句
  3. 命令式的语句完全(即let,if,return,x = ...)

结果是使用表达式编写的两个纯(引用透明)函数- 没有赋值(或重新赋值),并且没有副作用.

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 !
Run Code Online (Sandbox Code Playgroud)


Sov*_*iut 7

const greeting = [
  'Morning', 'Morning', 'Morning', 'Morning', 'Morning', 'Morning', 'Morning', 
  'Morning', 'Morning', 'Morning', 'Morning', 'Morning',
  'Afternoon', 'Afternoon', 'Afternoon', 'Afternoon', 'Afternoon',
  'Evening', 'Evening', 'Evening', 'Evening', 'Evening', 'Evening', 'Evening'
]

return `Good ${greeting[time]} ${name}!`
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这使您可以灵活地在未来添加更多时间,例如'Noon'在第12小时添加.此外,由于类似的原因,它使本地化更容易; 某些区域设置可能有Noon其他区域可能没有.

这本来是个笑话;)


Mac*_*ora 1

需要明确的是,您没有进行任何突变,您使用的是 let 而不是 const。为什么它不是一个突变 - 因为字符串在 javascript 中是不可变的。所以你的问题更多 - “如何将条件值分配给 const”。

需要明确的是,我不认为在此处执行let和此类行为有什么问题。在这没有超出函数范围之前,改变它就可以了(我更多地谈论一般方法,例如对象)。

不变性规则应用于在函数范围之外声明的结构。直接意味着你永远不应该改变函数输入,也永远不要碰不属于你的东西。

就这一点而言,我的答案是 - 保持原样,对我来说,它比具有许多条件的三元运算符清楚得多。