[英]What is the difference between ImmutableJS Map() and fromJS()?
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(…)
有人可以解释这个区别。
谢谢,
在这个例子中,
var a = {address: {postcode: 5085}}
var d = Immutable.Map(a);
这里, d.get('address')
是不可变的 。 它的值不能改变为任何其他对象。 我们只能使用Immutable.Map.set()
函数从现有对象创建一个新Object。
但是, d.get('address')
引用的对象,即{postcode:5085}
是一个标准的JavaScript对象。 这是可变的 。 像这样的声明可以改变postcode
的价值:
d.get('address').postcode=6000;
如果再次检查d的值,则可以看到他的值已更改。
console.log(JSON.stringify(d)); //Outputs {"address":{"postcode":6000}}
这违反了不变性原则。
原因是像List
和Map
这样的ImmutableJS数据结构只赋予List
/ Map
的level-1成员不变性特征。
因此, 如果对象内部有数组或数组内的对象,并且希望它们也是不可变的,那么您的选择是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}}
从上面的例子中你可以清楚地知道fromJS
如何使嵌套成员不可变。
我希望你理解Map
和fromJS
之间的区别。 一切顺利=)
fromJS
做了很深的转换。 也就是说,它将通过所有键递归并将所有元素转换为列表,地图等。
在第二个示例中, address
是一个普通对象,而不是ImmutableJS对象,因此您不能使用setIn
来更改其值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.