Immutable Data

Immutable

概念

immutable意为"不可变的",在编程中Immutable.js用来创建一个不可变的数据类型,对该类型数据进行修改时会生成一个新对象,新对象与原对象完全一致,但是内存地址不同,互不影响。

JS中如果想实现Immutable的效果,可以通过深拷贝基于原对象创建一个新对象的方式实现。

ini 复制代码
const data = {
  id: "data",
  author: {
    name: "mdemo",
    github: "https://github.com/demohi"
  }
};
const new_data = structuredClone(data);
console.log(data === new_data); // false

Immutable官网地址:immutable-js.com

作用

  • 降低可变数据带来的复杂性
    • 引用赋值虽然节省空间,但是会随着应用越来越复杂后带来意外的bug
  • 节省空间
    • immutable.js底层使用结构共享,会尽量复用内存
  • 撤销重做
    • 将每次输入的数据存储在一个数组中,任意的回退和重做
  • 拥抱函数式编程
    • Immutable 更适合函数式编程,给定输入其输出则一致

适用场景

React中使用Immutable Data

React中组件的Re-render可能由props和state改变引发的,而React对于新旧props和新旧state采用的是浅比较,如果引用类型数据的地址没有发生改变,但是内容改变了,则会导致视图显示错误。

而Immutable Data的特点就是不可变,修改、增加、删除对象都会创建一个新对象,内存地址不相同,不会发生以上问题。

常用API

List

List对应JS中的数组结构。

创建数据

ini 复制代码
const emptyList = List();
const newList = List([1,2,3,4,5]);
console.log(emptyList,newList);

修改数据

ini 复制代码
const newList = List([1,2,3,4,5]);
newList.push(6);
console.log(emptyList,newList);

接收新数据

ini 复制代码
const newList1 = newList.push(6);
console.log(newList,newList1,newList === newList1);

共享未变数据

ini 复制代码
const obj = {
  name:'臭臭',
  age:4
}
const obj1= {
  name:'酸酸',
  age:5
}

const newList = List([obj]);
const newList1 = newList.push(obj1);
console.log(newList === newList1);
console.log(newList.get(0) === newList1.get(0));

Map

Map对应JS中的对象结构。

创建数据

ini 复制代码
const myMap = Map({ x: 1,y: 2 })
const emptyMap = Map();
console.log(emptyMap,myMap);

修改数据

php 复制代码
const myMap = Map({
  x: { num:1 },
  y: { num: 2}
})
myMap.set('y',{num:3});
console.log(myMap);

接收新数据

ini 复制代码
const myMap = Map({
  x: { num:1 },
  y: { num: 2}
})
const myMap1 = myMap.set('y',{num:3});
console.log(myMap1, myMap=== myMap1);

共享未变数据

dart 复制代码
const myMap = Map({
  x: { num:1 },
  y: { num: 2}
})
const myMap1 = myMap.set('y',{num:3});
console.log(myMap.get('x')=== myMap1.get('x')); // true

Set

Set对应JS中的new Set结构。

创建数据

ini 复制代码
const mySet = Set([{ name:'臭臭',age:4}])
const emptySet = Set();
console.log(emptySet,mySet);

修改数据

php 复制代码
const mySet = Set([{ name:'臭臭',age:4}])
mySet.add({name:'酸酸',age:5});
console.log(mySet);

接收新数据

ini 复制代码
const mySet = Set([{ name:'臭臭',age:4}])
const mySet1 = mySet.add({name:'酸酸',age:5});
console.log(mySet1, mySet === mySet1);

共享未变数据

less 复制代码
console.log(mySet.get({ name:'臭臭',age:4 }) === mySet1.get({ name:'臭臭',age:4 })); // true
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学4 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端