亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不可變方法在 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/[email protected](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/[email protected](lodash.min.js+lodash.fp.min.js)'></script>


只有“父”對象被更改,因此必須克隆它們。不屬于突變一部分的葉子不需要改變。


在您的示例中,它出錯的原因是因為您組合了不可變和可變代碼,這不是一個好主意。如果您改變了預期不可變的代碼,這些克隆優化顯然會出錯。


查看完整回答
反對 回復 2023-09-14
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號