【问题标题】:mutations in javascript - best practices [closed]javascript中的突变-最佳实践[关闭]
【发布时间】:2020-08-10 13:54:58
【问题描述】:

我有一位同事认为在这种情况下我们需要避免突变:

const doSomethingWithData = async () => {
  const dataObject = await getData();
  dataObject.message = "hi";
}

他宁愿这样:

const doSomethingWithData = async () => {
  const dataObject = await getData();
  const copyOfDataObject = Object.assign({}, dataObject); 
  copyOfDataObject.message = "hi";
}

大家对此有何看法?我们在代码中调用了很多函数,并且很多函数返回一个对象......复制函数返回的每个对象非常乏味(而且 - 似乎内存也很糟糕?)......

编辑:道歉 - 这似乎是一个意见问题

我想将我的问题重新表述为如何使 dataObject 不可变?假设 dataObject 具有嵌套属性...

【问题讨论】:

  • 最好不要修改const 变量,即使它是数组或对象。在我看来,你也可以使用对象解构 {...dataObject}
  • JavaScript 不是一种函数式编程语言,对象注定会发生变异。
  • @DominikMatis 这不是 const 在 JavaScript 中的意思,它只是意味着你没有重新分配变量,它没有说明变量所指的内容。更新 const 变量中的数组很常见。
  • 另外Object.assign({}, dataObject) 只会创建一个浅拷贝,并不能防止嵌套/复杂的属性突变
  • @Kaiido - 你能解释一下 - copyOfDataObject 在哪里被丢弃?

标签: javascript mutation


【解决方案1】:

避免 JS 中的任何对象突变是一个好习惯,除非您无法避免。正如您所说,复制每个对象并从中创建一个新对象是很乏味的,因此开发人员使用诸如 ImmutableJS 之类的库或任何其他库,无论是第三方还是自己的实用程序,它们都负责不改变对象。

【讨论】:

  • 我以前从未听过这个建议。
  • 可变性导致不可预测的行为,而不变性导致应用程序开发更简单。
  • 如何在每次想要更新对象时进行复制(如代码 sn-p 中的)让事情变得更简单?
  • 这就是我建议 immutable-js 而不是每次都复制的原因。
  • Asutosh - 你是说当一个对象被传递时你的所有代码 - 你使用 ImmutableJS 吗?你看 - 我的数据库中有很多表和许多从表中检索特定数据的函数......每次数据在我的代码中传递......我是否要使用 ImmutableJS 使其不可变?
【解决方案2】:

在处理数组和堆栈时,我更喜欢使用突变。在其他工作情况下,我总是避免使用突变,因为它可能是一种失去对代码中正在发生的事情的控制的方式。 :))

【讨论】:

  • 嗨,保罗 - 很好奇 - 你会如何处理我在帖子中遇到的情况?
  • 这取决于您任务的所有上下文。如果这是一个小的修改 - 嗯,为什么不呢?但是如果您使用大对象并在不同的功能/多次/et.c 中更新它 - 我更愿意避免突变
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
相关资源
最近更新 更多