2024年最全不可变数据之Immutable_var goodsmutablelist mutablelist,2024年最新Golang岗面试必问

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

在讲不可变数据(Immutable Data)前,先说说可变数据(Mutable Data),在原生js中创建的数据都是可变的,如:

    var a = {qty:1}
    a.qty = 10;

可能有小伙伴说,可以用const啊,const对基本数据类型还行,但对引用数据类型根本没辙,如

    const a = {qty:1}
    a.qty = 10;
​
    a.qty;// 10

如果把对象a赋值给其它变量还会导致新的问题,如:

     const a = {qty:1}
     const b = a;
​
    a.qty = 10;
​
    b.qty;//10

这时你会发现,修改了a,b的值也跟着改了,这其实是js采用引用赋值的方式来实现数据共享的,好处就是节省内存,但缺点也显而易见,稍微不注意就会导致改A坏B的棘手问题,在复杂的项目中,这种问题还不易排查,有诸多安全隐患。

之前的做法是,利用深拷贝的方式来解决这个问题,虽然问题解决了,但又会引发新的问题:浪费内存,还有对一些需要频繁更新数据又有高性能要求的场景(如:React),深拷贝实则为一个不明智的操作,于是,Imutable.js的出现就是要解决这些开发痛点的。

Immutable.js 由Facebook 工程师 Lee Byron 花费 3 年时间打造,在js中的引用赋值可以节省内存,但随着应用的不断复杂后,状态的改变往往会变成噩梦,通常的做法是复制数据来避免被修改,但这样又造成了CPU和内存的消耗,而Immutable利用结构共享可以很好地解决这些问题。

不可变数据:Immutable Data

Immutable Data 是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是对于不需要改变的数据采用结构共享的方式,如下图

常用数据类型

  • List: 有序索引集,类似JS中的Array。
  • Map: 无序索引集,类似JS中的Object。
  • OrderedMap: 有序的Map,根据数据的set()进行排序。
  • Set: 没有重复值的集合。
  • OrderedSet: 有序的Set,根据数据的add进行排序。
  • Stack: 有序集合,支持使用unshift()和shift()添加和删除。
  • Record: 一个用于生成Record实例的类。类似于JavaScript的Object,但是只接收特定字符串为key,具有默认值。
  • Seq: 序列,但是可能不能由具体的数据结构支持。
  • Collection: 是构建所有数据结构的基类,不可以直接构建。

正如你看到的,immutable.js的数据类型有很多,本文主要介绍比较常用的ListMap,对应于js中的数组和对象。

js与immutable之间的转换

可通过fromJS()toJS()两个方式实现js和immuatble数据的转换,如:

    import Immutable from 'immutable';
    const goods = {name:'huawei mate30 pro',price:5998,brand:'huawei'}
​
    // js -> immutable data
    const imData = Immutable.fromJS(goods)
​
    // immutable data -> js
    imData.toJS()

fromJS()toJS()会深度转换数据,随之带来的开销较大,尽可能避免使用,单层数据转换应直接使用Map()List()进行转换。另外,还可以直接通过JSON.stringify()对immutable数据转换也json字符串。

    import {Map,List} from 'immutable';
​
    const initState = Map({
        breadcrumb:List([]),
        user:Map({}),
        manageMenuStatus:false
    })

操作immutable数据

获取immutable中的值:get(key)/getIn(keys)

Map 和 List的通用方法,实现如下

    import {Map,List} from 'immutable';
    let state = Map({
        version:'2.0',
        user:Map({
            username:'laoxie',
            age:18,
            hobby:List(['代码','电影','唱歌'])
        }),
    })
​
    // 获取 version
    state.get('version');// 2.0
​
    // 获取username
    state.getIn(['user','username']);// laoxie
​
    // 获取hobby属性数据
    state.getIn(['user','hobby',1]) // 电影

注意: 和传统的js不同,
getIn()获取深层深套对象的值时不需要做每一层级的判断是否存在,如不存在则会返回

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值