【发布时间】:2016-10-05 03:41:27
【问题描述】:
请原谅这个极其简单的例子,但我想知道当您需要使用 obj 的值而不使用 immutablejs 或任何其他类似的库修改它的深层嵌套属性时,以下两种方法有什么区别:
//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),其中包含我们不想改变的深度嵌套的 props,但我们需要使用它们修改后的值。在案例 1 中,我们创建了一个 Immutable obj 并使用 Immutable.js 方法直接修改它,在第二种情况下,在我们创建了一个 Immutable 对象之后,我们从中创建了一个原生 Javascript 变量,这样我们就可以使用直接赋值和其他原生方法更轻松地使用它javascript方法。在这两种方法中,我们都达到了保持 imm_a 和 imm_b 不变的目标,但我发现第二种方法更容易修改。但是有什么区别吗?推荐哪一种作为更好的做法?
PS:在这两种情况下,我都不关心b 或a 的不变性,我只需要imm_a 和imm_b 保持不变。一个常见的用例是 Redux 应用程序,其中新状态依赖于旧状态,您需要在将旧状态值作为新状态返回之前修改旧状态值。 a 和 b 是这里的局部临时变量。问题是,只要我不依赖它们具有持久值,就可以直接修改它们吗?或者如果我使用不可变的做法,我需要将所有内容都视为不可变?
【问题讨论】:
标签: javascript redux immutability immutable.js