javascript中的变异-最佳实践

javascript中的变异-最佳实践,javascript,mutation,Javascript,Mutation,我有一位同事认为,在这种情况下,我们需要避免突变: const doSomethingWithData = async () => { const dataObject = await getData(); dataObject.message = "hi"; } 他希望是: const doSomethingWithData = async () => { const dataObject = await getData(); const co

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

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具有嵌套属性…

避免JS中的任何对象变异是一种很好的做法,除非您无法避免它。正如您所说的,复制evry对象并从中创建一个新对象是很繁琐的,因此开发人员使用诸如ImmutableJS之类的库或任何其他库,无论是第三方库还是自己的实用程序库,都会注意不使对象发生变异。

我更喜欢在处理数组和堆栈时使用变异。在其他工作情况下,我总是避免使用突变,因为这可能会导致代码中发生的事情失控。:)

最好不要修改
const
变量,即使它是数组或对象。在我看来,你也可以使用对象解构{…dataObject}JavaScript不是函数式编程语言,对象是要变异的。@DominikMatis这不是
const
在JavaScript中的意思,它只是意味着你没有重新分配变量,它没有说明变量引用的内容。更新常量变量中的数组是很常见的。还有
Object.assign({},dataObject)
只会创建浅层副本,不会阻止嵌套/复杂属性mutation@Kaiido-你能解释一下-被丢弃的
copyOfDataObject
在哪里吗?我以前从未听过这个建议。可变性导致不可预测的行为,不变性导致更简单的应用程序开发。你是如何做到的每次你想更新一个对象时都要做一个副本,就像在代码片段中一样,这会让事情变得更简单吗?这就是为什么我建议每次都做一个副本而不是不可变的js。Asutosh-你是说当一个对象被传递时,你所有的代码都使用不可变的js吗?你看,我的数据库中有很多表,还有很多函数从表中检索特定数据。。。每次在我的代码中传递数据时。。。我要用ImmutableJS使它不可变吗?嗨,保罗-好奇-你会如何处理我在帖子中遇到的情况?这取决于你任务的所有上下文。如果只是一个小小的修改-嗯,为什么不呢?但是,如果您使用大对象并在不同的函数中进行更新/多次/et.c-我更喜欢避免变异