序言
要认知 JavaScript中浅复本和深复本的差别,具体来说要知道JavaScript的正则表达式。JavaScript有三种正则表达式,此基础正则表达式和提及正则表达式。
1. 此基础正则表达式: undefined、boolean、number、string、null,留存在栈缓存中的单纯统计数据
2. 提及正则表达式:Array、第一类、Function,留存在堆内存空间中
简述
如下表所示图:
JavaScript中浅复本和深复本的差别和同时实现
注解:
a1 = 0;a2 = this is str;a3 = null, 存放在栈缓存中;
var c =[1,2,3] 与 var d = {m:20} ,**cp与缓存地址储存在栈缓存中**,**但**[1,2,3]与{m:20} 做为**第一类储存在堆缓存中**;
此基础正则表达式的拷贝
var a = 20; var b = a;如下表所示图:
JavaScript中浅复本和深复本的差别和同时实现
提及正则表达式的拷贝
var m ={ a:10, b:20 }; var n = m;JavaScript中浅复本和深复本的差别和同时实现
m与n指向同一个缓存空间,当m或者n改变时,另一个也跟着改变
如
m.a = web秀; console.log(n.a); // 输出 web秀怎么样使提及正则表达式有各自独立的缓存空间???
深度复本方法
采用递归的方法复本第一类
JavaScript中浅复本和深复本的差别和同时实现
## 奇技淫巧
利用**此基础数据类型**方式,把第一类转换成字符串,进行拷贝。具体点说就是,用JSON.stringify与JSON.parse同时实现深复本。原因是JSON.stringify(obj)转换成字符串,变成基本正则表达式,基本类型复本是直接在栈缓存新开空间,直接拷贝一份名-值,不影响之前的第一类。请看代码:
JavaScript中浅复本和深复本的差别和同时实现
总结
1. 浅复本(shallow copy):只拷贝指向某个第一类的指针,而不拷贝第一类本身,新旧第一类共享一块缓存;
2. 深复本(deep copy):拷贝并创建一个一摸一样的第一类,不共享缓存,修改新第一类,旧第一类保持不变;
同时实现深复本主要有2种方法
(1)递归
(2)JSON.stringify结合JSON.parse