为了账号安全,请及时绑定邮箱和手机立即绑定

不可变方法在 lodash fp 中如何工作?

不可变方法在 lodash fp 中如何工作?

收到一只叮咚 2023-09-14 17:54:32
我想了解 lodash/fp 的不可变方法是如何工作的。他们是否在更改集合之前深度克隆集合,或者是否在对象的两个版本之间实现某种结构共享?我试图“从外部”理解它,但无法得出明确的结论。在下面的第一种情况下,更改更新的集合不会影响原始集合。然而,在第二种情况下,改变更新的集合确实会影响原始集合。var fp = _.noConflict();var data = { a: { c: {} } };var updatedData = fp.set(["a", "c", "d"], 5, data);updatedData.a.c.e = 9;console.log(updatedData.a.c.e, data.a.c.e);var data2 = { a: { c: [] } };var updatedData2 = fp.set(["a", "d"], 5, data2);updatedData2.a.c[0] = 9;console.log(updatedData2.a.c[0], data2.a.c[0]);<script src='https://cdn.jsdelivr.net/g/lodash@4.17(lodash.min.js+lodash.fp.min.js)'></script>我还在Lodash github上发布了这个问题。
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

他们是否在更改集合之前深度克隆集合,或者是否在对象的两个版本之间实现某种结构共享?


是的,他们使用结构共享。


我们可以在这个例子中看到该c对象被重用,而不是克隆。这很有用,因为它的大小可能非常大(在我的例子中它包含整个window对象!)。

您可以想象尝试深度克隆它会浪费资源。


var fp = _.noConflict()

var data, updatedData



data = { a: { c: { window: window } } }

updatedData = fp.set(["a", "d"], 5, data)

console.log(updatedData.a.c === data.a.c)

<script src='https://cdn.jsdelivr.net/g/lodash@4.17(lodash.min.js+lodash.fp.min.js)'></script>


只有“父”对象被更改,因此必须克隆它们。不属于突变一部分的叶子不需要改变。


在您的示例中,它出错的原因是因为您组合了不可变和可变代码,这不是一个好主意。如果您改变了预期不可变的代码,这些克隆优化显然会出错。


查看完整回答
反对 回复 2023-09-14
  • 1 回答
  • 0 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信