您的位置:首页 » 分类: JavaScript & 实用函数方法 » 文章: JavaScript 中不可变数据结构(Immutable structures)和克隆(clone)

JavaScript 中不可变数据结构(Immutable structures)和克隆(clone)

小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货。各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握..

对象克隆是一个棘手的问题,它有很多边缘情况。原因很简单。对象维持内部状态有很多技巧及衍生品,但是很容易被滥用。

克隆对象是你应用程序正在发展的指示器,并且你有一个复杂的对象,你想要作为一个不变的值,即在保持先前状态的同时进行操作。

如果这个对象在你的控制范围之内,那么你很幸运。如果要进行一些重构,可能会让你重新考虑对象的结构和行为来完全避免问题。

随着函数式编程技术的重新兴起,关于不可变数据结构进行了无数次的争论,以及它们如何提供你你所追求的内容。有些人可能会争辩说,可变状态是万恶之源。

我们鼓励使用 Facebook 的 ImmutableJS ,它提供了一整套不可变结构,免费使用。通过重新思考你的对象的内部运作,并将状态与行为分开,通过重新思考你的对象的内部工作和分离状态与行为,使每个函数销毁一个状态来产生一个新的状态 – 非常像 Haskell’s State monad 。这样你可以减少许多麻烦。

如果这个对象不在你的控制范围之内,那么你的运气不好。这可以通过创建复杂的计算来避免,在这些计算中,你可以自己解决循环引用并获得启迪。但是,当你在使用外部对象时,它们必须来自外部来源,然后你可能可以使用另一个外部库来更方便地克隆这个外部对象,并让你只关注最重要的事情,即你应用程序本身。

这样的库有很多,其中一个就是库是 pvorb/clone,它具有非常简单的API。 克隆对象只需要:

var clone = require('clone');

var a = {foo: {bar: 'baz'}};
var b = clone(a);
a.foo.bar = 'foo';
console.log(a); // {foo: {bar: 'foo'}}
console.log(b); // {foo: {bar: 'baz'}}

当然,还有许多库可以帮你做同样的事情,比如 Ramdalodash.clonedeep
lodash.clone.

作为结束语,如果您认真处理不可变据结结构,您可能需要检查 ClojureScriptPureScript

我们既不鼓励也不批判使用自制的克隆机制。我们只是注意到在这一领域已经做了大量的工作,而且你可能比重新发明轮子更好。

原文链接:http://www.jstips.co/en/javascript/immutable-structures-and-cloning/

正文完。下面还有一个推广让最好的人才遇见更好的机会!

互联网行业的年轻人,他们面对着怎样的职业瓶颈、困惑与未来选择?过去,这鲜有人关心。资深的职场人,也多半优先选择熟人去推荐机会。

100offer致力于改变现状,帮互联网行业最好的人才发现更好的机会。使用 100offer.com 或 100offer App ,可以一周内获得中国、美国等数千家优质企业的工作机会。

马上去遇见更好的机会
推广结束

关注WEB前端开发官方公众号

关注国内外最新最好的前端开发技术干货,获取最新前端开发资讯,致力于打造高质量的前端技术分享公众号

发表评论

电子邮件地址不会被公开。 必填项已用*标注