数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。
(1)基本类型:就是值类型,字符串,即在变量所对应的内存区域存储的是值。
特点:直接存储在栈(stack)中的数据,拷贝后形成新的数据,修改拷贝后的数据也不会影响原始数据。
(2)引用类型:就是地址类型(相当于编号---便于寻找),对象/数组。
特点:存储的真实数据在堆中,但是在栈中被引用,拷贝后不生成新的数据,是引用,修改拷贝后的数据会影响原始数据。
深拷贝和浅拷贝都是主要针对Object和array对象。
浅拷贝只复制指向某个对象的指针,不复制对象本身,新旧对象还是共享同一块内存。深拷贝会另外创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会修改到原对象
浅拷贝实现
1.Object.assign()
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
注意:当object只有一层的时候,是深拷贝
2.Array.prototype.concat()
修改新对象会改到原对象
3.Array.prototype.slice()
同样修改新对象会改到原对象
关于Array的slice和concat方法的补充说明:Array的slice和concat方法不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。
深拷贝的实现
1.JSON.parse(JSON.stringify()),但是这种方法不能处理函数
2.手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。