Immutable 特性
https://io-meter.com/2016/09/03/Functional-Go-persist-datastructure-intro/
持久化的数据结构(Persistent Data Structure)
对这类数据结构进行的任何修改,都会返回一个修改后的备份,而不会影响原来结构中的内容
解决了什么问题?
1.以状态机的观点来看待程序,状态的转换可能要对应多个操作,如果其中执行失败的话(状态修改了一半),这样既没办法继续往下进行转换,也没办法回到上一个状态,导致程序进入了一个错误的状态。使用持久化的数据结构,修改过程不会影响源数据结构,可以在操作执行完毕后,将新的状态赋值给旧的状态,完成状态的转换。
2.解决了并发程序中数据读写不一致的问题(加锁会增加程序的复杂度以及影响运行性能)
缺点:
1.修改会生成新的对象,耗费内存空间
2.持久化数据结构往往会对源数据进行包装,以实现不可变的特性,这导致实现复杂,读取速度慢
应用场景:react渲染优化、并发编程
结构化共享(Structural Sharing)

内部使用字典树储存数据。修改后返回的新对象是基于旧对象的,能实现数据共享,从而达到节省内存的目的
实践
let map1 = Immutable.Map({a:1, b:1, c:1});
let map2 = Immutable.Map({a:1, b:1, c:1});
console.log(map1 === map2) //false
// 值比较
console.log(Immutable.is(map1, map2)) //true
Immutable 特性的更多相关文章
- 创建immutable类
不可变对象(immutable objects) 那么什么是immutable objects?什么又是mutable Objects呢? immutable Objects就是那些一旦被创建,它们的 ...
- .Net中的不可变集合(Immutable Collection)简介
今天发现MS在Nuget上发布了一个Immutable Collection的程序集,提供了对不可变对象的集合的支持. 简单的看了一下,貌似支持的还比较全: ImmutableArray<T&g ...
- Java 的不可变类 (IMMUTABLE CLASS) 和 可变类 (MUTABLE CLASS)
一.简单定义不可变对象(Immutable Objects)即对象一旦被创建,它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects).当满足以下条件时,对 ...
- UnrealScript语言基础
总体特征 (1)大小写不敏感.关键字.宏.变量名.函数名以及类名不区分大小写:变量名可以与关键字同名 (2)局部变量.成员变量未初始化时,会被编译器初始化 (3)没有全局变量.全局函数,所有东西必须写 ...
- Effective C# Chapter1-Language Elements
<EffectiveC#>这本书讲了一些关于C#语言的使用技巧和经验. 该系列文章是备忘录和自己的一些见解.程序猿们最喜欢这类问题了,欢迎讨论~ 菜单 Item 1 使用属性取代公共成员变 ...
- Java-String之寻根问底
Java-String之寻根问底 引言 在java编程中,几乎每天都会跟String打交道,因此,深入理解String及其用法十分有必要.下面分三方面来详细说明下String相关的特点及用法 •Imm ...
- 深入理解.net - 4.你必须知道的String
为什么要单独写string,主要是它太常用了,同时又太特殊了,特殊到CLR对它的处理都和其它对象不一样.简直可以称为VIP用户啊.本文并不是一篇介绍如何使用string的文章,而是旨在阐述string ...
- 2018年最新JAVA面试题总结之基础(1)
转自于:https://zhuanlan.zhihu.com/p/39322967 1.JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗? 回答: 能,Jav ...
- java工程师-面试知识点总结
目录(转载) [x] 一.Java基础(语言.集合框架.OOP.设计模式等) [x] 二.Java高级(JavaEE.框架.服务器.工具等) [x] 三.多线程和并发 [x] 四.Java虚拟机 [x ...
随机推荐
- PostgreSQL-11-WITH语句
1.WITH语句原理:通用表表达式(Common Table Expressions)/CTEs,在大型查询中的辅助语句 WITH name_for_summary_data AS ( SELECT ...
- BZOJ2440(容斥+莫比乌斯函数)
题目本质: 首先有如下结论: 而通过写一写可以发现: 举例来讲,36及其倍数的数,会被1的倍数加一遍,被4的倍数扣一遍,会被9的倍数扣一遍,而为了最终计数为0,需要再加回来一遍,所以在容斥里面是正号. ...
- Jasper_crosstab_headerPosition_columngroup header position config - (headerPosition="Stretch")
i.e <columnGroup name="column11" height="20" totalPosition="Start" ...
- 百度Ueditor多图片上传控件
发现百度的Ueditor富文本编辑器中的多图片上传控件很不错,于是便想着分享出来使用,费了老劲,少不了无名朋友的帮助,也查了不少资料,终于搞定了 发代码给大家,请大家多多指正 1.首先要在html页面 ...
- ReferenceError: password is not defined
报错提示位置at c:\Users\Administrator\WebstormProjects\blogtest\routes\index.js:19:16 原因是我这个password没有定义,p ...
- mysql查询问题
需求:根据选择不同的分类id,查找到同时属于选中的分类的文章id sql语句: select result,GROUP_CONCAT(category_id) from (select categor ...
- IE兼容只读模式
表单input具有只读模式属性,一般来说,一般的浏览器都支持该属性,即readyonly,但IE不支持,只能寻找其兼容性. 第一种:unselectable='on' <input id=&qu ...
- 学习cocos2dx3.1.0
static_cast<type-id>expression 该运算符把expression转换为type-id类型 Lambda表达式 CallFunc::create([=](){} ...
- Spring MVC异常统一处理(包括普通请求异常以及ajax请求异常)
通常SpringMVC对异常的配置都是返回某个jsp视图给用户,但是通过ajax方式发起请求,即使发生异常,前台也无法获得任何异常提示信息.因此需要对异常进行统一的处理,对于普通请求以及ajax请求的 ...
- MySQL常用函数使用示例
#从指定字符中,随机生成12位字符select substring('0123456789abcdefghijklmnopqrstuvwxyz',floor(0+RAND()*36),12); #显示 ...