使用 immutable.js 相对于 Object.assign 或扩展运算符的优势

2024-06-25

到目前为止,我看到的大多数“入门样板”和一些关于 React / Redux 的帖子都鼓励使用不可变.js https://facebook.github.io/immutable-js/来解决可变性。我个人依靠Object.assign或传播运算符来处理这个问题,因此并没有真正看到 immutable.js 的优势,因为它增加了额外的学习,并且与用于可变性的普通 js 技术有所不同。我试图找到转换的正当理由,但无法找到,因此我在这里询问它为什么如此受欢迎。


这一切都与效率有关。

持久数据结构

持久数据结构在发生变异时会始终生成新的数据结构,从而保留其自身的先前版本。为了避免昂贵的克隆,仅存储与先前数据结构的差异,而在它们之间共享交集。这种策略称为结构共享。因此,持久数据结构比克隆更有效Object.assign或扩展运算符。

Javascript 中持久数据结构的缺点

不幸的是,Javascript 本身并不支持持久数据结构。这就是 immutable.js 存在的原因,它的对象与普通的旧 Javascript 有很大不同Objects。这会导致更冗长的代码以及大量持久数据结构到本机 Javascript 数据结构的转换。

关键问题

immutable.js 结构共享(效率)的优点何时超过其缺点(冗长、转换)?

我想这个库只有在具有大量和广泛的对象和集合的大型项目中才会有回报,当整个数据结构的克隆和垃圾收集变得更加昂贵时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 immutable.js 相对于 Object.assign 或扩展运算符的优势 的相关文章

随机推荐

  • 究竟要消化什么并在 XMLDSIG 上签名以及如何进行? (或者,OSX 本机客户端与服务器上计算的 XMLDSIG 不匹配)

    我正在尝试使用封装签名 sha1 摘要和 rss sha1 签名按照 XMLDSIG 规范对 xml 文档进行签名 并且服务器不断返回 297 拒绝 签名与计算的 结果 不匹配 297 Rejeicao Assinatura difere
  • mediaelement.js - 具有固定最大尺寸的响应式视频

    我该如何设置媒体元素 js questions tagged mediaelement js缩小视频以适应小屏幕尺寸 但不将其放大到超出其实际尺寸 除了将其包装在正确大小的 div 中之外 如果我找不到更好的解决方案 我会回退到这个位置 我
  • 为什么linkedhashmap维护双向链表进行迭代

    因为任何线程都没有内部合理的解释 请给我确切的理由 对于插入顺序 用单链表维护就足够了 但为什么不呢 在这种情况下 双向链表如何提高性能 所有方法都是从 hashmap xpt 4 方法继承的 那么 hashmap 的迭代器不维护顺序 而
  • “真正的”多维数组的定义是什么以及哪些语言支持它们?

    我读过的大多数编程书籍都有以下几行 X 语言不支持真正的多维数组 但您可以使用数组的数组来模拟 近似 它们 由于我的大部分经验都是基于 C 的语言 即 C Java JavaScript php 等 因此我不确定什么是 真正的 多维数组 a
  • Guzzle 获取文件并转发

    我有一个网络服务 可以获取文件并将其返回给用户 基于 Symfony 自从我使用curl 来做到这一点 我刚刚发现 guzzlehttp 看起来很棒 但是 我不知道如何使用 guzzle 执行此操作 而不将下载的文件 xml 或 txt 保
  • 如何将表中的表单数据 POST 到 PHP

    我目前正在为工作中的员工创建一个时间表表单 但我一直致力于正确发布输入值 我已经设置了一个数据库 但现在我什至无法获取要在 php 页面中显示的值 这是我当前表中的示例
  • Raspberry pi 3 B+ 中的串行通信

    我想在 Raspberry pi 3 B 和 GSM GPRS A6 之间进行通信 我尝试过 但无法从 Raspberry pi 向 GPRS 模块发送数据 现在 我知道在较新的操作系统 在我的例子中是 Raspbian Stretch 中
  • Haskell 中的随机枢轴快速排序

    是否有可能在 Haskell 中实现快速排序 使用 RANDOM PIVOT 但仍然有一个简单的Ord a gt a gt a 签名 我开始了解 Monad 目前 我将 monad 解释为某种 命令模式 这对于 IO 非常有用 所以 我知道
  • Roslyn:将 C# 转换为 VB

    我有这样的情况 我需要将 C 项目转换为 VB NET 项目 我想自动化这个 所以我不能使用在线工具或类似的东西 有 粘贴为 C VB 示例 Visual Studio 扩展 https github com akimboyko MetaP
  • 如何将 Angular 7 应用程序包含在现有的 html 文件和网站中?

    我一方面有一个现有网站 另一方面有一个 Angular 7 应用程序组件 我想编辑现有的someusecase html并重用我的 Angular 7 应用程序 例如
  • VS 2010 和 MBUnit 如何只运行一项测试

    我安装了 Gallio MbUnit 并使用 VS 2010 RC 我希望能够运行单个单元测试或 TestFixture 内的所有单元测试 而不是每次调试时整个项目中的所有测试 在 VS 2010 中如何做到这一点 安装testdriven
  • 如何最大限度地减少 Go 中的垃圾收集?

    有时您可能想避免 最小化垃圾收集器 所以我想确定如何做到这一点 我认为下一个是正确的 在函数的开头声明变量 使用数组代替切片 还有吗 为了最大限度地减少 Go 中的垃圾收集 您必须最大限度地减少堆分配 为了最大限度地减少堆分配 您必须了解分
  • SignalR - 如何向除呼叫者之外的所有人发送消息

    我有一个 Aspnet core 3 1 MVC 应用程序 我在其中配置了 SignalR 集线器 我有一个控制器 我可以在其中进行依赖注入 oIHubContext private readonly IHubContext
  • 如何在拖动另一个元素时获取鼠标光标下的元素?

    我用谷歌搜索并找到了几个答案 但它们都是关于单击或鼠标移动事件的 这些事件不适合我的问题 基本上 我允许用户从列表中拖动项目并将其放在另一个列表中的文件夹上 并且每当项目拖动到元素上时 我想突出显示元素 在文件夹列表中 监听文件夹列表上的
  • 无法找到类型 [Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers]

    我正在尝试对来自指定进程参数的 Powershell 的构建进行排队 我收到以下错误 知道我做错了什么吗 无法找到类型 Microsoft TeamFoundation Build Workflow WorkflowHelpers 确保包含
  • CUDA双指针内存复制[重复]

    这个问题在这里已经有答案了 我这样写了我的示例代码 int d ptr cudaMalloc void d ptr sizeof int N int tmp ptr N for int i 0 i
  • 如何从 Uri xamarin android 获取实际路径

    我想从 Uri 获取实际路径 当我使用意图选择文件时 它将返回 URI 但下面的代码行无法将 URI 转换为字符串路径 打开文件选择器 public static void PickFile Activity context Intent
  • 在 Powershell 中获取小文件的“磁盘大小”

    我正在使用一个遗留系统 该系统有大量来自外部系统的导入 其中大多数通过下载文件 根据上下文大小不同 处理它 然后将文件存储在 SAN 卷上的其他位置 格式为 NTFS 和安装在 WS2008R2 盒子上 我们遇到的问题是 由于簇的大小 大量
  • 取消选择单选选项

    我正在使用引导单选按钮 http getbootstrap com javascript buttons并希望允许取消选择无线电组 这可以使用额外的按钮来完成 Fiddle http jsfiddle net norlihazmeyGhaz
  • 使用 immutable.js 相对于 Object.assign 或扩展运算符的优势

    到目前为止 我看到的大多数 入门样板 和一些关于 React Redux 的帖子都鼓励使用不可变 js https facebook github io immutable js 来解决可变性 我个人依靠Object assign或传播运算