Javascript ImmutableJS Map()和fromJS()之间有什么区别?
有人能解释一下区别吗Javascript ImmutableJS Map()和fromJS()之间有什么区别?,javascript,immutable.js,Javascript,Immutable.js,有人能解释一下区别吗 谢谢,fromJS进行了深度转换。也就是说,它将递归所有键,并将所有元素转换为列表、映射等 在第二个示例中,address是一个普通对象,而不是ImmutableJS对象,因此不能使用setIn更改其值。在本示例中 var a = {address: {postcode: 5085}} var b = Immutable.fromJS(a) var c = b.setIn(['address', 'suburb'], 'broadview').toJS(); // no
谢谢,
fromJS
进行了深度转换。也就是说,它将递归所有键,并将所有元素转换为列表、映射等
在第二个示例中,address
是一个普通对象,而不是ImmutableJS对象,因此不能使用setIn
更改其值。在本示例中
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(…)
在这里,d.get('address')
是不可变的。它的值不能更改为任何其他对象。我们只能使用ImmutableJS的Immutable.Map.set()
函数从现有对象创建一个新对象
但是,d.get('address')
引用的对象,即,{postcode:5085}
是一个标准的JavaScript对象。它是可变的。这样的语句可以更改postcode
的值:
var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);
如果再次检查d的值,可以看到该值已更改
d.get('address').postcode=6000;
这违反了不变性原则
原因是像List
和Map
这样的不可变js数据结构只将不可变特性赋予List
/Map
的一级成员
因此,如果您在数组中有对象,或者在对象中有数组,并且希望它们也是不可变的,那么您的选择是不可变的。fromJS
console.log(JSON.stringify(d)); //Outputs {"address":{"postcode":6000}}
从上面的示例中,您可以清楚地知道fromJS
如何使嵌套成员不可变
我希望您理解
Map
和fromJS
之间的区别。祝您一切顺利=)omg,非常感谢您的解释!我一直在努力解决这个问题,我终于明白了为什么我的map.get(k)是通过引用返回的(以及如何避免它而不做一些愚蠢的deepCopy(map.get(k))。太棒了!Immutable.js映射文档不清楚与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}}