Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ImmutableJS Map()和fromJS()之间有什么区别?_Javascript_Immutable.js - Fatal编程技术网

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}}