一. 什么是数据不可变性
数据不可变性,主要针对的是引用类型的数据,eg:对象、数组...
let obj1 = { name : "翔哥", age : 19, } obj1.name = "轩哥"
如上述的代码,把对象 obj1 的 name 属性的值改为了 "轩哥" ,但是对象 obj1 的值发生了突变!!!
如果,我们采用数据不可变的思想,应该如下:
let obj2 = Object.assign({} , obj1 , { name : "轩哥"})
此时,对象 obj1 的值并没发生改变,我们是通过 Object.assign({} , oldObj) 方法新建了一个对象 obj2 !!
如果是数组,就用 [ ].concat(oldArray)
二. 与 React.js 的关系
判断状态是否发生改变的diff算法:
React.js 组件有状态的概念。这就是使更新如此容易的原因 --- 当状态发生改变时,组件就重新渲染。但是,检查状态是否发生改变时,如果我们的状态很复杂,是嵌套对象时,就需要进行深度相等性检查,因为如果对于数据处理采用的是数据突变性的话,就无法仅仅通过状态的引用值是否相等来判断状态是否改变,因为我们并没有改变状态对象的引用值,仅仅是在状态对象内部进行的修改!!!
三. 数据不可变性的优缺点
优点:
-
提高组件的性能
-
使某些功能更容易
- 因为使用数据不可变,可以非常容易地获得数据的之前版本,这使实现更改历史记录或者撤销/重做等功能时非常方便!!!
缺点:
-
需要依赖专门的库才会使它更好地工作
-
与小数据集的可变方法比较,性能较低
- 比较消耗内存