原谅极其简单的例子,但我想知道当你需要使用obj的值而不使用immutablejs或任何其他类似的libraires修改它的深层嵌套属性时,以下两种方法之间有什么区别: / p>
//case1
var imm_a = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var a = Immutable.fromJS(imm_a);
a = a.setIn(['owns','car', 0], 'Ford');
//...a bunch of other modifications using immutable.js methods
console.log(a.toJS()); // using the changed value
console.log(imm_a); // imm_a has not changed
//case2
var imm_b = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var b = Immutable.fromJS(imm_b);
b = b.toJS();
b.owns.car[0] = 'Ford';
//...a bunch of other modifications using native javascript methods
console.log(b); // using the changed value
console.log(imm_b); // imm_b has not changed
在上述两种情况下,我们都有一个具有深层嵌套道具的对象(imm_a和imm_b),我们不想改变这些道具,但我们需要使用它们的修改值。在第一种情况下,我们创建一个Immutable obj并使用Immutable.js方法直接修改它,在第二种情况下,我们创建一个Immutable对象之后,我们从它创建一个本机Javascript变量,这样我们可以使用直接赋值和其他本机更轻松地使用它javascript方法。在这两种方法中,我们达到了我们的目标,即保持imm_a和imm_b不变,但我发现第二种方法更容易修改的简单性。但有什么区别吗?哪一个被推荐为更好的做法?
PS:在这两种情况下,我都不关心b
或a
的不变性,我只需要imm_a
和imm_b
保持不变。一个常见的用例是Redux应用程序,其中新状态依赖于旧状态,您需要在将其返回为新状态之前修改旧状态值。 a
和b
是本地临时变量。问题是,只要我不依赖它们具有持久值,是否可以直接修改它们?或者,如果我使用不可变的实践,我需要将所有内容都视为不可变的吗?
答案 0 :(得分:0)
第二个例子完全违背了使用ImmutableJS的目的,因为你正在改变b
Javascript对象的内容。 ImmutableJS的一个要点是,如果修改一个对象,就会得到一个全新的对象。
在这个简单的例子中它不会产生任何影响,但编写不可变代码的好处是,任何引用a
的人都知道它永远不会改变,并且它总是具有相同的值。他们明白了。在您的第二个示例中,由于您将b
变为适当位置,因此任何其他引用b
的代码都会将“地毯从其下方拔出”可以这么说,因为您的本地更新也会碰巧他们对这个对象的引用。
如果您不使用ImmutableJS来确保实际的不变性,那么您最好暂时不使用它。它为程序添加了非平凡的开销工作。