ImmutableJS Map()和fromJS()有什么区别?

sow*_*dri 39 javascript immutable.js

var a = {address: {postcode: 5085}}

var b = Immutable.fromJS(a)
var c = b.setIn(['address', 'suburb'], 'broadview').toJS(); // no error
console.log(c); 

var d = Immutable.Map(a);
var e = d.setIn(['address', 'suburb'], 'broadview').toJS(); // error invalid keyPath(…)
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个区别.

谢谢,

Sam*_*eph 75

在这个例子中,

var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);
Run Code Online (Sandbox Code Playgroud)

在这里,d.get('address')是不可改变的.它的值不能改变为任何其他对象.我们只能使用Immutable.Map.set()ImmutableJS函数从现有对象创建一个新Object .

但是,ie 引用d.get('address'){postcode:5085}对象是标准的JavaScript对象.这是可变的.像这样的声明可以改变以下值postcode:

d.get('address').postcode=6000;
Run Code Online (Sandbox Code Playgroud)

如果再次检查d的值,则可以看到他的值已更改.

console.log(JSON.stringify(d));   //Outputs {"address":{"postcode":6000}}
Run Code Online (Sandbox Code Playgroud)

这违反了不变性原则.

其原因是这样的ImmutableJS数据结构ListMap赋予不变性特征仅向的1级成员List/ Map.

因此,如果对象内部有数组或数组内的对象,并且希望它们也是不可变的,那么您的选择就是Immutable.fromJS.

var a = {address: {postcode: 5085}}
var b = Immutable.fromJS(a);
b.get('address').postcode=6000;
console.log(JSON.stringify(b));   //Outputs {"address":{"postcode":5085}}
Run Code Online (Sandbox Code Playgroud)

从上面的例子中你可以清楚地知道fromJS嵌套成员是如何不可变的.

我希望你明白之间的差别MapfromJS.一切顺利=)

  • 天啊,非常感谢你解释这个!我一直在为此苦苦挣扎,我终于明白为什么我的 map.get(k) 是通过引用返回的(以及如何避免它而不做某种愚蠢的 deepCopy(map.get(k))。 (2认同)

tim*_*fly 25

fromJS进行深度转换.也就是说,它将通过所有键递归并将所有元素转换为列表,地图等.

在第二个示例中,address是一个普通对象,而不是ImmutableJS对象,因此您无法使用它setIn来更改其值.