拷贝

js实现浅拷贝和深拷贝

守給你的承諾、 提交于 2019-11-29 21:45:20
js类型有两种,一种是基本数据类型(null,undefined,Boolen,string,number,)和引用数据类型(array,object); 这两种数据类型数据存放在另个不同的地方;基本数据类型在栈中,引用数据类型的值存在堆中,而他的值得地址会存在栈中。 当我们在直接赋值的时候赋值的是地址。 const a = {a:'haha'} const b = a; 当 我们修改b中的值得时候 a 中的值也会随之发生改变; 这就是因为我们直接赋值的时候赋值的是存在栈中的地址。他们都是指向同一个堆里的数据;b变化,a也就变化; 但是有时候我们不想让a也发生变化,这时就会用到深拷贝和浅拷贝; 这里首先讲一下浅拷贝; 这是我们发现,当arr变化并不会导致arr1变化; 接下来请睁大你的眼睛继续看下去; 同样是一份浅拷贝,但是当arr2中的是一个对象的时候,arr2的变化也会导致arr3的变化; 浅拷贝:对对象地址的复制,不会进行递归复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址。 而深拷贝是将原对象和属性一起赋值出去,复制到一份新的内存当中;二者不会有关联; 深拷贝最常用的方法:JSON.parse(JSON.stringfiy()); 这里arr1中的a对象并不会发生改变; 但是如果对象中含有function则会出现问题; 浅拷贝方法还有以下几种; Array

Object.assign的使用

北城余情 提交于 2019-11-29 21:33:07
语法: Object.assign(target, ...sources)//target目标对象,sources源对象,返回值目标对象 使用说明: 如果目标对象中的属性具有 相同的键 ,则属性将被源对象中的 属性覆盖 。后面的源对象的属性将类似地覆盖前面的源对象的属性。 String 类型和 Symbol 类型的属性都会被拷贝。 目标对象自身也会改变 针对深拷贝,需要使用其他办法,因为 Object.assign() 拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向 那个引用 继承属性和不可枚举 属性是 不能拷贝 的 深拷贝 obj1 = { a: 0 , b: { c: 0}}; let obj3 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}} 来源: https://www.cnblogs.com/wyongz/p/11533852.html

day_08

两盒软妹~` 提交于 2019-11-29 21:32:49
上节课回顾 元组内置方法 不可更改的列表,其他的和列表一模一样 散列表 参考 字典内置方法 乱序--》pyton2中字典是乱序的,但是pyton3做了优化 使用方法: [key]可以取值,也可以修改至 get可以获取值,没有获取到值那就默认返回None setdefault 按key获取值,如果没有这个key就增加,有就不做修改 集合内置方法 去重--》同样的值存的位置是一样的,拿到第一个就不会拿第二个 乱序--》插值是按照某种哈希算法随机插的 进行数学集合运算 交集 并集 补集 差集 add添加 remove删除 discard删除 深浅拷贝 拷贝 l2为l1的拷贝对象时,l1内部所有数据类型变化,l2就变化 浅拷贝 l2为l1的浅拷贝对象时,l1内部的可变数据变化,l2就变化;l1内部的不可变数据变化,l2不变 深拷贝 l2为l1的深拷贝对象时,l1内部的任何数据变化,l2也不变 今日所学 字符编码 文本编辑器存储信息的过程 文本编辑器 --》 写文本 --》 存储信息 显示屏(内存) --》(转换)硬盘 #ASCII码的转换关系 print(chr(65)) print(ord('a')) 早期,每个国家都有自己国家的字符编码,每个国家也只能使用自己国家的计算机。 这个时候就出现了unicode编码 Unicode编码可以识别所有国家的编码 Unicode存储占用太多空间

Java轻量级锁原理详解(Lightweight Locking)

烂漫一生 提交于 2019-11-29 20:37:40
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现的。 互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。 为了优化Java的Lock机制,从Java6开始引入了轻量级锁的概念。 轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。 它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互斥前,进行补救。 本文将详细介绍JVM如何利用CAS,实现轻量级锁。 原理详解 Java Object Model中定义,Object Header是一个2字(1 word = 4 byte)长度的存储区域。 第一个字长度的区域用来标记同步,GC以及hash code等,官方称之为 mark word 。第二个字长度的区域是指向到对象的Class。 在2个word中,mark word是轻量级锁实现的关键。它的结构见下表 从表中可以看到,state为lightweight locked的那行即为轻量级锁标记。bitfieds名为指向lock record的指针,这里的 lock

深浅拷贝

我的未来我决定 提交于 2019-11-29 19:54:30
深浅拷贝 当一个对象是另一个对象的浅拷贝时,其中一个对象中的不可变数据类型的变化,不会引起另一个对象相应数据的变化;而一个对象中的可变数据类型变化,也会引起另一个对象相应数据的变化。 当一个对象是另一个对象的深拷贝时,其中一个对象中的不可变数据类型和可变数据类型的变化,都不会一起另外一个对象数据的变化。 来源: https://www.cnblogs.com/YajunRan/p/11530730.html

day07_正课总结

こ雲淡風輕ζ 提交于 2019-11-29 19:43:10
目录 元组内置方法 元组: 1.作用 2.定义方式 3.使用方法 4.有序无序 5.可变不可变 字典内置方法 字典 1.作用 2.定义方式 3.使用方法 4.有序无序 5.可变不可变 集合内置方法 集合 1.作用 2.定义方式 3.使用方法 有则删除返回值None没有则报错 有没有都返回None,有还会删除 随机删除一个,不能有参数 4.有序无序 5.可变不可变 深浅拷贝 拷贝 浅拷贝 深拷贝 说明 数据类型总结 存值个数 有序无序 可变不可变 深浅拷贝 元组内置方法 元组: 什么是元组tuple:只可取不可更改的列表,元组一被创建就被写死了 1.作用 压缩数据,节省内存 2.定义方式 ()内用逗号隔开多个元素(可以为任意数据类型) i = (1,2,3) j = tuple((1,2)) 只有一个元素时,必须得加逗号并且逗号会打印出来 3.使用方法 ​ 1.索引取值 ​ 2.索引切片 ​ 3.for循环 ​ 4.成员运算 ​ 5.len长度 ​ 6.index获取元素所以 ​ 7.count计数 4.有序无序 有序 5.可变不可变 元组内元素值不可修改,不存在此概念 字典内置方法 字典 字符串/列表/字典 常用,他们三个就足够描述世间万物了 其他数据类型可以被替代--> 列表代替元组,redis数据库替代集合 1.作用 存储多个数据,对每个数据具有描述 2.定义方式 {

day 07

余生颓废 提交于 2019-11-29 19:41:37
day 07 01.元祖内置方法 作用;被写死的列表 定义方式;tuple (x,x,x,x,x) # 一经定义就不可更改 如果元祖只有一个元素,要加逗号,#元祖一定要有逗号 #占用内存小 使用方法; tup=(1,2,3,4) 索引取值 tup[0] 索引切片 tup[0:2] for循环 for i in tup: 成员运算 2 in tup len长度 len(tup) index获取元素索引 tup.index(2) count 计数 tup.count(2) 有序or无序; 有序 可变不可变; 不可更改 02.字典内置方法 作用;储存多个值,对每个值都有描述 定义方式;dict {'a':'b','c':'d'} 使用方法; dic={'a':1,'b':2,'c':3} 优先掌握 按key取值/修改值 dic['a'] # 按key取值 dic['a'] = 0 # 按key修改值 添加值 dic['d'] = 9 # 定义没有的键值对 for循环 for i in dic: # 只循环key 成员运算 'a' in dic len长度 len(dic) keys/values/items print(dic.keys()) # 获取所有key为列表 print(dic.values()) # 获取所有值为列表 print(dic.items()) #

day07 总结

妖精的绣舞 提交于 2019-11-29 19:38:04
目录 元组内置方法 字典内置方法 散列表/哈希表存储数据 集合内置方法 数据类型总结 存值个数 有序or无序 可变or不可变 深浅拷贝(只针对可变数据类型) 深浅拷贝 拷贝 浅拷贝 深拷贝 元组内置方法 什么是元组(tuple):只可取不可更改的列表,元组一创建就被写死了 作用:元组一创建就被写死了 定义方式:()内用逗号隔开多个元素(可以为任意数据类型) 如果元组只有一个元素,必须得加逗号 使用方法 索引取值 索引切片 for循环 成员运算 len长度 index获取元素索引 count计数 有序or无序 有序 可变or不可变 压根没有这一说 定义元祖--》占用内存小--》写死了 字典内置方法 作用 储存多个数据,对每个数据具有描述 定义方式 {}内用逗号隔开多个键key(具有描述意义,不能为可变数据类型):值value(任意数据类型)对 使用方式 按key取值/按key修改值 添加值,没有就添加,有就修改 for循环 成员运算 len长度 keys/values/items get 获取(没有就返回None,可以给定一个默认值 update 更新(等同于list里的extend) fromkeys setdefault(只添加不修改) 有序or无序 无序 可变or不可变 可变 散列表/哈希表存储数据 相比较列表,哈希表插入/删除数据更快 首先对key做了哈希处理

9.16总结

故事扮演 提交于 2019-11-29 19:35:26
元组 1.定义:只可取,不可更改的列表,()内用逗号隔开多个元素(可以为任意数据类型) #lt=list([1,2,3]) tup=tuple((1,2,3)) print(tup,type(tup)) 运行结果: (1, 2, 3) <class 'tuple'> 2.作用:元组一创建就被写死了 如果元组只有一个元素,必须得加逗号 tup1=(1,) print(tup1,type(tup1)) 运行结果: (1,) <class 'tuple'> 3.使用方法: 索引取值 print(tup[0]) #1 索引切片 print(tup[0:3]) #(1,2,3) for循环 for i in tup: print(i) #1 2 3 成员运算 print(0 in tup) #false len长度 print(len(tup)) #3 index获取元素索引 print(tup.index(1)) #0 计数 print(tup.count(2)) #1 有序or无序:有序 可变or不可变:不可变 字典 *字符串/列表/字典--》常用,他们三个就足够描述世间万物了 其他数据类型可以被替代--》列表替代元组,redis数据库替代集合 1.字典作用:存储多个数据,对每个数据具有描述 2.定义方式:{}内用逗号隔开多个键key(具有描述意义,不能为可变数据类型):值value

关于Python中的深浅拷贝

99封情书 提交于 2019-11-29 19:33:48
之前一直认为浅拷贝是拷贝内容的第一层,但是不开辟内存,只是增加新的指向原来的内容;深拷贝是拷贝是拷贝每一层并开辟内存。 其实这个是不严谨的不正确的。 从以上可以看出,浅拷贝中当时可变类型的时候,内存是发生了变化的,也就是开辟了内存,但是不可变类型的时候内存地址不发生变化的。 总结:浅拷贝是对数据的内容进行拷贝,对不可变类型创建指向引用,可变类型开辟内存存储,但是只是拷贝第一层。深拷贝是拷贝数据的每一层的可变类型并开辟内存,但是不可变类型只是创建引用。 来源: https://www.cnblogs.com/blackball9/p/11529806.html