集千篇理论,终得深拷贝与浅拷贝的初解

一、栈和堆

 栈(stack)和堆(heap)
stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放

 二、数据类型

1.基本数据类型:
undefined、
null、string、number、boolean、symbo(ES6)
2.引用数据类型:
Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)

 三、引用数据和基本数据类型的区别

区别:引用类型值可添加属性和方法,而基本类型值则不可以
基本类型 (所有的操作都针对于值) 基本类型的变量是存放在内存(Stack)里的
基本数据类型的数据大小确定,内存空间大小可以分配 基本数据类型的值是按访问的 var a=20;---console.log(a) 基本类型的值是不可变的 基本类型的比较是它们的的比较 引用类型 引用类型的值是保存在堆内存(Heap)中的对象(Object)
引用类型的空间大小不一样 引用类型的值是按引用访问的 var obj={name:'赵丽颖'} console.log(obj.name) 引用类型的值是可变的 引用类型的比较是引用的比较
引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存

                           栈内存

举个栗子:小明和小红都有各自共同的老婆……大概就这么个意思。

                         堆内存

举个栗子:我和美女共同租一间房,美女下班打扫了房间卫生,那我的房子也就打扫了……(皮一下真的开心)

 四、深拷贝与浅拷贝

浅拷贝是指创建一个对象,这个对象有着原始对象属性值的一份精确拷贝
如果属性是基本类型,那么拷贝的就是基本类型的值,如果属性是引用类型,
那么拷贝的就是内存地址,所以如果其中一个对象修改了某些属性,那么另一个对象就会受到影响。
深拷贝是指从内存中完整地拷贝一个对象出来,并在堆内存中为其分配一个新的内存区域来存放,并且修改该对象的属性不会影响到原来的对象。

 举个栗子:

浅拷贝:(1) Object.assign的方式 (2) 通过对象扩展运算符 (3) 通过数组的slice方法 (4) 通过数组的concat方法。

深拷贝:(
1) 通过JSON.stringify来序列化对象 (2) 手动实现递归的方式。

猜你喜欢

转载自www.cnblogs.com/gzw-23/p/11816027.html