初学immutable.js的一些总结

1.immutableObj在复制的时刻,复制的是援用。

=== 比较的是援用是不是一样。
而is()和equal()示意的是值是不是一样,什么是值,我以为就是将一个对象Json.stringify()以后的的数据。

整体而言,假如===相称,那末运用equal()和is()也是相称的;
假如只是is和equal()相称,可以===相称,也多是两个对象被json.stringify()以后的字符串是相称的。

假如是像map1 = map3的赋值操纵,实在这里复制的是援用。
就上面的结论可知,只需援用向雷同, === 和 equals() 返回的都是true.

2.immutable中的对象的运用和es2015灰常的像,一个最大的区分,就是不论啥时刻,返回值都是一个新的immutable鸠合。
比方arr=[1,2] ,arr.push(3,4)的返回值是4,即arr的新长度。
在immutable中,arr1=List([1,2]) , arr1.push(3,4)的返回值是List([1,2,3,4]),即一个新的immutable对象。

3.immutable对象和es2015中原生的对象是可以自在兼并的。啥意思?就是当obj被immutable的Map对象merge,
或许是array被immutable的List来concat的时刻,es2015中的array和object就被自动对应转换成了List和Map.

说白了,就是当Array或许Object被传入immutable的List和Map运用的要领的时刻,会做一个范例检测,假如接收的参数是
Array,就将该Array转换成List,假如参数是Object, 就将该Object转换成Immutable的Map.

换一个角度看,这可以让我们更天真的兼并处置惩罚es2015的原生对象和immutable对象。即扩大了es2015原生对象的要领集。

注重:运用immutable对象的api将es2015原生对象Object转换成immutable中的map的时刻,这个Object的一切key值都会被作为字符串处置惩罚。

假如Object运用的是[变量]的体式格局设置的key值,当运用immutable的map的api将其转换成map的时刻,这个key值就是[变量]中的
“变量”指代的字符串。
但假如变量指代的不是字符串,而是对象呢? ==> 当然是把这个对象stringy成一个字符串啊

4.immutable对象如何转换成es2015的原生对象呢?
这里的转换有三种: 对应浅拷贝的浅转换;toObject() / toArray()
对应深拷贝的深转换; toJS() , toJSON()
直接转换成字符串; JSON.stringify(immutableObj)
注重: 这里的toObject() / toArray / toJS() / toJSON都是map和list通用的。

5.一切的immutable的对象都是iterable对象,这可就意味着它可以被yield,可以被for of, 也可以被…标记所睁开。

6.操纵嵌套immutable数据结构的有用体式格局就是运用特地操纵嵌套数据的api.
比方mergeDeep(),getIn(),setIn(),updateIn(). 这4个要领被运用在List,Map和OrderedMap对象上。
getIn()/setIn()/updateIn()通报的第一个参数是key值构成的途径。
而mergeDeep()通报的参数是一个嵌套Obj.

7.当map在运用本身的api来update本身的时刻,假如update的结果和本身原本是如出一辙的,
那末该update的api返回的对象的援用和本身是一样的。
当update以后的结果和本身差别,那末update返回的对象会被在内存中新建一个援用。

es2015中原生的map假如运用set()更新了本身的数据,不论更新以后,数据有无变化,
set()要领返回的援用都是一样的。

8.假如想要屡次变动某个immutable对象,然则却只须要天生一个新的immutable对象,
可以运用withMutations()要领。在这个要领中,只可以运用set,push,pop,clear,unshift,shift ,
update, setIn , updateIn , mergeIn,mergeDeepIn() , concat()要领。

9.seq是一种可以运用链式誊写的对象。它在运用链式誊写的时刻,只会发生一个新对象,链式中心的操纵是不会发生新的对象的。
其他的经常使用对象,比方Map和List可以经由过程Seq()转换成一个seq对象。然则事实上,这类对象有什么样的详细作用还尚不清晰。

下面遴选了List对象来举行深度剖析,下面是一些API的纪录:

/**

  • List对象可以由3种体式格局转换而成。
  • (1) es2105中的Array;
  • (2) es2015中的set
  • (3) immutable中的set
  • (4) es2015中的Array或许set的遍历器接口 : someArray[Symbol.iterator]()

*

  • 可以经由过程List.of()要领组织List.这个和es2015的Array.of()是一样的。

*

  • 更新List中的值运用的是set()要领,这个和es2015中的Array和set都差别,和es2015的map设置值的体式格局是一样的。
  • 这里的set()要领的第一个参数是索引,该索引可所以负数,用法和Array中运用slice()要领参数为负数是一样的。

*

  • 删除List中的数据,运用的是delete()要领。该要领在es2015中的set和map中均有运用,然则此处的delete()要领返回的是
  • 一个布尔值。而List中运用的delete()要领更像Array中的splice(index,1),只不过,delete()的返回值是一个新的List,
  • 而splice()返回的是被删除的项目。

*

  • 向List中增添数据,运用的是insert()要领,和Array中的splice(index, 0 , value)一样。返回的是一个新的List()对象。

*

  • 对List的首尾增减运用的是和es2015中的Array一样的体式格局,只不过这4个api返回的都是一个新的List对象。
  • push(), pop(), shift(), unshift()

*

  • 假如想要更新List中某一个已有项目的value,运用的是update()要领。这个要领接收2个参数,第一个参数是索引,第二个参数
  • 是一个函数,这个函数接收之前在该索引位置的值作为参数,返回一个新value,可所以恣意范例。注重,update()是更新已有的值,
  • set()是设置某个位置上的值,假如谁人位置上已经有值,运用set()设置以后,该位置上的值会被替代。

*

  • 假如想要向Array设置length一样,粗犷地重置一个List的长度,运用的要领是setSize()要领。两者结果是一致的。
  • setSize()返回一个新长度的List()对象。

*

  • 假如想要深度设置List内部嵌套的数据,运用setIn()要领,第一个参数是索引构成的途径。第二个参数是新设置的值。
  • 话说这个嵌套是个什么嵌套法?
  • 当嵌套的是Array或许是List的时刻,path中都是索引;当嵌套的是Object或许是Map的时刻,path是索引和key组合的。

*

  • 假如想更新嵌套List,运用的api是updateIn(),该参数接收两个参数,一个是索引构成的path,第二个依旧是一个函数,接收
  • 该位置老数据作为参数。

*

  • 类似于Array中的其他要领,比方concat(),map(),filter()要领的运用都和Array是一样的,只不过这几个要领返回的都是新的
  • List对象。然后在map()和filter()要领中的item都是一个Immutable对象。

*

  • 另,List中的另有filterNot()要领,实在就是对filter()要领取反。其他的运用要领一样,也是返回一个布尔值。

*

  • 另,List中另有reverse()和sort()要领,reverse()要领和Array中的reverse()要领是一样的,都是用来将索引翻转。
  • sort()是排序要领,可以传入一个函数,经由过程返回值的正负一定元素的前后排序递次。

*

  • 假如是一个简朴map挪用sort()举行排序,sort((a,b)=>{})中的a和b是map中的第一层value.
  • 假如是一个庞杂的map想要运用sort来排序,可以因为value的数据范例差别,sort()函数根本就没法比较。
  • 此时须要运用sortBy()函数,该函数接收两个参数,第一个参数用来指定要比较的是每个map项目中的某个部份,
  • 第二个参数和sort()函数接收的回调是一样的,即比较那一项,依据返回值的正负一定排序。

*
*

  • 假如想要将一个List转换成Array,有浅转换和深转换。
  • someList.toJS() : 递归转换List成es2015中的array,将List中的一切项目转换成Array和object;

*

  • someList.toJSON() 和 someList.toArray() 都是将一个List浅转换成array,也就是说,将这个List转换成Array,这
  • 个array中的items的范例是不会被转换的。之前的List中的第一层数据假如有List和Map,那末浅转换以后的Array的
  • 第一层item照样List和Map.

*

  • someList.toObject()可以将List转换成key是string的Object.

*
*

  • 上面的要领都是讲怎样操纵全部List的。下面的有几个要领讲怎样猎取List中的item.或许给item赋值的。
  • get(index)猎取某个索引位置的value;
  • has(index) 推断某个索引是不是是存在的。比方一个List的size是6,那末has(7)一定返回false.
  • includes(value) 推断List中存在某个value.这个参数value假如和List中的某个value是值等的,就返回true.

*
*

  • 另,在Array中另有splice()要领啊,indexof(), lastIndexOf(), List中也有这些要领,运用结果都是一样的。

*

  • **/
    原文作者:qinqinlv
    原文地址: https://segmentfault.com/a/1190000018204367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞