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数据结构List和Map赋予不变性特征仅向的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嵌套成员是如何不可变的.
我希望你明白之间的差别Map和fromJS.一切顺利=)
tim*_*fly 25
fromJS进行深度转换.也就是说,它将通过所有键递归并将所有元素转换为列表,地图等.
在第二个示例中,address是一个普通对象,而不是ImmutableJS对象,因此您无法使用它setIn来更改其值.
| 归档时间: |
|
| 查看次数: |
17005 次 |
| 最近记录: |