当前位置: 首页 > 面试题库 >

为什么要在object.freeze上使用immutablejs?

何章横
2023-03-14
问题内容

我在网上研究过immutablejs的好处,Object.freeze()但是没有发现任何令人满意的东西!

我的问题是,当我可以冻结一个普通的旧javascript对象时,为什么我应该使用该库并使用非本机数据结构?


问题答案:

我认为您不了解immutablejs提供的功能。这不是一个使您的对象变得不可变的库,而是一个使用不可变值的库。

在不简单重复他们的文档和任务说明的情况下,我将说明它提供的两件事:

  1. 类型。他们实现了(不可变的)无限范围,堆栈,有序集,列表等。

  2. 它们的所有类型都实现为持久数据结构。

我撒谎了,以下是他们的使命宣言:

不变的数据一旦创建就无法更改,从而可以简化应用程序开发,进行防御性复制,并可以使用简单的逻辑实现高级的备忘和更改检测技术。持久数据提供了一个可变API,该API不会就地更新数据,而是始终产生新的更新数据。

我强烈建议你阅读它们链接到更多关于持久数据结构(因为他们的文章和视频 东西immutablejs约),但我会在一个句子或如此总结:

假设您正在编写游戏,并且有一个坐在2D平面上的玩家。例如,这里是鲍勃:

var player = {
  name: 'Bob',
  favouriteColor: 'moldy mustard',

  x: 4,
  y: 10
};

由于您喝了FP koolaid,所以您想冻结播放器(brrr!希望Bob穿一件毛衣):

var player = Object.freeze({
    name: 'Bob',
    ...
});

现在进入游戏循环。每次滴答声,玩家的位置都会改变。由于播放器对象已冻结,我们不能仅仅对其进行更新,因此我们将其复制到:

function movePlayer(player, newX, newY) {
    return Object.freeze(Object.assign({}, player, { x: newX, y: newY }));
}

很好,很花哨,但是请注意我们正在进行多少无用的复制:在每个刻度上,我们创建一个新对象,遍历一个对象,然后在它们之上分配一些新值。在每个刻度上,在每个对象上。那真是满嘴。

不可变为您解决了这一问题:

var player = Immutable.Map({
    name: 'Bob',
    ...
});

function movePlayer(player, newX, newY) {
    return player.set('x', newX).set('y', newY);
}

通过持久数据结构的“ *✧”魔术✧゚ ヽ,他们承诺将进行尽可能 的操作。

心态也有所不同。当使用“普通的旧的(冻结的)javascript对象”时,所有方面的默认操作 都是
假定可变性,并且您必须付出额外的努力才能实现有意义的可变性(也就是说,确认状态存在的可变性)。那是freeze存在的部分原因:当您尝试执行其他操作时,事情会慌乱。当然,使用Immutablejs时,不可变性是默认的假设,并且它上面还有一个不错的API。

并不是说所有的都是粉红色和玫瑰色,上面是樱桃。当然,所有事物都有其弊端,您不应该仅仅因为可以就在不可变的地方塞满东西。有时候,仅仅freeze一个对象就足够了。哎呀,多数认为是时候
绰绰有余。这是一个有用的库,有它的利基市场,只是不要被炒作所迷惑。



 类似资料:
  • 问题内容: 为什么要在上使用pip?难道不是PyPI和程序包作者最主要的原因吗?如果作者将废话源tarball(例如:丢失的文件,没有)上传到PyPI,则pip和都会失败。除了外观上的差异外,为什么Python的人(如上述推文中)似乎强烈青睐pip而不是? (假设我们正在谈论由社区维护的Distribute软件包中的) 问题答案: 这里的许多答案在2015年已经过时了(尽管丹尼尔·罗斯曼最初接受的

  • 问题内容: 我的用例需要一个数据结构。我应该能够将项目推送到数据结构中,而我只想从堆栈中检索最后一个项目。该堆栈的JavaDoc说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如: 我绝对不希望这里出现同步行为,因为我将使用方法本地的数据结构。除了这个,我为什么还要在这里呢? PS:Deque的Javadoc说: 双端队列也可以用作LIFO(后进先出)堆栈。

  • 问题内容: 我一定会丢失一些东西,但是我已经看了几天了,但是到底为什么您会使用log4j2而不是log4j(而不是性能)? 从目前为止我所看到的,log4j2被宣传为更易于配置,但实际上却要复杂得多(现在已经三天了,我仍然无法在我的主目录中写日志)。自动配置对我根本不起作用(或者至少我无法使其工作),配置文件本身的结构实质上更复杂,在运行时添加东西以帮助诊断似乎更加困难。 因此,除了性能之外,还有

  • 我需要一个数据结构用于我的用例。我应该能够将项目推入数据结构,并且我只想从堆栈中检索最后一个项目。JavaDoc for Stack表示:

  • 问题内容: 我们知道,双冒号()用于科特林,如获得功能(可赎回)的参考,。 在Java中,我们使用和获取类。为什么在科特林我们使用和,而不是一个函数/方法? 问题答案: 在Kotlin中,有关元编程的内容包括方法引用,属性引用和类文字。请参阅有关类文字的讨论。

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的