【发布时间】:2021-03-11 08:00:10
【问题描述】:
我想了解 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上发布了这个问题。
【问题讨论】:
-
你能告诉我是什么让我的 sn-p 不是最小的吗?
-
哦,对不起,看错问题了...
-
如果我对the source 的理解正确,Lodash 会克隆被调用函数的所有参数,因此您的第一个示例几乎不等于
_.set(["a", "c", "d"], 5, _.cloneDeep(data)) -
如果有 cloneDeeep,那么在第二个例子中 data.a.c[0] 应该是 9
-
我不知道 lodash 但是树(由对象形成)可以通过将路径从根复制到更新的叶子来共享结构,从而有效地获得不变性。您不能对数组执行此操作。造成这种差异的更深层原因是树是递归的,因此是代数数据结构,而数组不是。
标签: javascript functional-programming lodash immutability