为什么React和Redux要强调数据不可变性

408 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第15天

什么是不可变性(Immutability)

不可变性是每一个前端开发人员都必须弄明白的概念。不可变性意味着React或者Redux的状态不能改变,不能直接修改状态,当状态需要改变时,采用复制一份的方式去改变。

为什么要用不可变性

因为有时候,知道状态因为什么而引起变化可能非常困难。比如访问次数count,很难知道该数值是由哪些人改变的。

对于两个相同大小的数组,知道它们是否相等的唯一方法是比较每个元素。对于大型阵列而言,这是一项成本高昂的操作。

为了解决以上问题,最简单的解决方案是使用不可变对象。如果需要更新对象,则必须创建具有新值的新对象,因为原始对象是不可变的,无法更改。这样就可以使用引用是否相等来知道状态是否被改变。

不可变性的好处

可预见性

如果让状态可以被任意修改,则会产生意外的副作用,这可能会引起一些难以预料的错误。当我们强制要求状态不可变时,可以使应用程序体系结构和心智模型保持简单,从而更轻松地看清代码的逻辑。

性能

尽管向不可变对象添加值意味着需要创建一个新的对象,这会需要复制现有对象的值,并且需要将新值添加到新对象中,从而消耗更多内存,但不可变对象可以利用结构共享来减少内存开销。

原理类似Git的增量更新,感兴趣的话可以自行查阅相关资料。

跟踪状态变化

除了减少内存使用量外,不可变性还允许开发者通过利用引用和值相等来优化应用程序。这使得开发者能够更加容易发现状态是否有任何变化。例如,component中的状态更改,可以通过比较状态对象来检查状态是否相同,并防止不必要的重复渲染。