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

标签 javascript ecmascript-6 immutability

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

我如何以不改变 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'

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


虽然你有两个的顾虑,但将它们分开会对你有好处

  1. 根据小时确定天数
  2. 组装问候语

通过这样做,您可以避免

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

结果是两个使用 表达式 编写的纯 ( 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/

相关文章:

javascript - AngularJS 指令函数的执行顺序

javascript - 提交表单时使用 AJAX

javascript - 在 Express + NodeJS 应用程序的 Controller 中使用 ES6 类或对象文字

javascript - 防止组件卸载 - 在打开其他组件之前向用户显示通知

javascript - 使用不变性助手修改数组的每个值

c# - ReadOnlyCollection<T> 必须是不可变的

javascript - 如何将变量从 Controller 传递到 application.js?

javascript - 将 jquery 数据发送到 struts Action

javascript - 避免在 TypeScript 中生成 `f(...args: any[])` 的死代码

redux - 将数组插入对象内部时如何避免突变