JavaScript中实现不可变对象
实现不可变数据有三种主流的方法
- 深克隆,但是深克隆的性能⾮常差,不适合⼤规模使用
- Immutable.js,Immutable.js 性能良好,但是需要学习额外的API
- immer,利用Proxy特性,⽆需学习额外的api,性能良好
immer的使用方法
安装immer
yarn add immer 或者 npm install immer --save
import { produce } from 'immer' const currentState = { name: '圣斗士', age: 20, dance() { }, un: undefined, nu: null } const res = produce(currentState, draft => { console.log(this) //undefined 注意这里的this指向undefined 因为这里使用了箭头函数; 使用function的话 这里的this指向 draft console.log(draft) // Proxy {i: 0, A: {…}, P: false, I: false, D: {…}, …} }) console.log(res) // {name: "圣斗士", age: 20, un: undefined, nu: null, dance: ƒ} console.log(res == currentState) // true /** 修改draft里面的对象 **/ const res = produce(currentState, draft => { draft.name = '我是hero' draft.age = 35 }) console.log(res) // {name: "我是hero", age: 35, un: undefined, nu: null, dance: ƒ} console.log(res == currentState) // false /** 不改变currentState里面的引用数据 **/ const currentState = { name: '圣斗士', age: 20, dance() { }, un: undefined, nu: null , arr:[], obj:{} } const res = produce(currentState, draft => { draft.name = '我是hero' draft.age = 35 }) console.log(res.arr === currentState.arr) // true console.log(res.obj === currentState.obj) // true /** 修改currentState里面的引用数据 **/ const currentState = { name: '圣斗士', age: 20, dance() { }, un: undefined, nu: null , arr:[], obj:{} } const res = produce(currentState, draft => { draft.arr.push('hello') draft.obj.name = 'change state' }) console.log(res.arr === currentState.arr) // false console.log(res.obj === currentState.obj) // false
由此可见,对 draftState 的修改都会反应到 res上,而 Immer 使用的结构是共享的,res在结构上又与 currentState 共享未修改的部分。
参考
https://blog.csdn.net/Dylan666d/article/details/114745177
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
2020-10-10 uniapp
2019-10-10 git 创建分支 提交到远程分支