What is the difference between ImmutableJS Map() and fromJS()?

前端 未结 2 1145
悲哀的现实
悲哀的现实 2021-01-30 16:59
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 =          


        
相关标签:
2条回答
  • 2021-01-30 17:19

    fromJS does a deep conversion. That is, it'll recurse through all the keys and convert all elements to Lists, Maps, etc.

    In your second example, address is a plain object, not an ImmutableJS object, so you cannot use setIn to change its value.

    0 讨论(0)
  • 2021-01-30 17:35

    In this example,

    var a = {address: {postcode: 5085}}
    var d = Immutable.Map(a);
    

    Here, d.get('address') is immutable. It's value cannot change to any other objects. We can only create a new Object from the existing object using the Immutable.Map.set() function of ImmutableJS.

    But, the object referenced by d.get('address') i.e, {postcode:5085} is a standard JavaScript object. It is mutable. A statement like this can alter the value of postcode:

    d.get('address').postcode=6000;
    

    If you check the value of d again, you can see that he value has been changed.

    console.log(JSON.stringify(d));   //Outputs {"address":{"postcode":6000}}
    

    which is against the principles of immutability.

    The reason is that ImmutableJS data structures like List and Map imparts the immutability feature to only the level-1 members of the List/Map.

    So, if you have objects inside arrays or arrays inside objects and want them too to be immutable, your choice is 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}}
    

    From the above example you can clearly know how fromJS makes the nested members immutable.

    I hope you understood the difference between Map and fromJS. All the best =)

    0 讨论(0)
提交回复
热议问题