如何操作传递给函数的对象的属性而不改变状态

我想知道是否有可能改变传递给一个函数的对象的属性,而不会改变对象的状态。

像这样的东西:

function startOfLine(options) { options.someProp = += 'startOfLine'; return options; } function otherFunction(options) { // do something with options and... return options; } const options = startOfLine(otherFunction({ somePro: '', someProp2: '' })); 

我将以dynamic方式创build函数的执行,这就是为什么我不担心嵌套20个级别的调用。

谢谢。

当你想用函数式语言来更新一个对象时,通常的做法是返回一个新的对象的克隆版本,并修改一些属性(不需要修改原始对象)。 我不认为有一种内置的方式克隆JavaScript中的对象,但这个post提供了一个详细的答案 。 从这个答案中使用clonefunction,你可以写:

 function startOfLine(options) { var newOptions = clone(options); newOptions.someProp = 'startOfLine'; return newOptions; } 

当你有对象o1并且你写了var o2 = startOfLine(o1)那么你用startOfLine设置返回一个新的对象o2 ,但是不会改变o1

如果你没有在任何地方对对象进行变异,你可以执行浅拷贝(并避免克隆整个对象树),但是仍然有一些额外的开销 – 但是你得到了处理不可变对象的好的属性,这些属性经常超出成本。

不幸的是,我没有足够的声望发表评论。 所以试图根据一些合理的假设来回答。

您正在寻找一种方法来链接一些与单个对象相关的操作,并且效率更高,从而避免了过多的新对象的变化或创build。 最后的对象应该与应用的转换相同的对象(或一个副本?)。

如果这是您正在寻找的那个,那么可以通过使用哈希树来实现良好的内存效率。 你可以通过Facebook参考库immutable.js

https://facebook.github.io/immutable-js/