原理
自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象。
实现
1. object.assign
语法为:Object.assign(target, ...sources);
该方法的第一个参数是拷贝的目标对象,后面的参数是拷贝的来源对象(也可以是多个来源),即Object.assign 循环遍历原对象的属性,通过复制的方式将其赋值给目标对象的相应属性,
注意点:
它不会拷贝对象的继承属性;
它不会拷贝对象的不可枚举的属性;
可以拷贝 Symbol 类型的属性;
2. 扩展运算符方式
语法为:let cloneObj = { ...obj };
扩展运算符 和 object.assign 有同样的缺陷,也就是实现的浅拷贝的功能差不多,但是如果属性都是基本类型的值,使用扩展运算符进行浅拷贝会更加方便。
3. concat 拷贝数组
数组的 concat 方法其实也是浅拷贝,所以连接一个含有引用类型的数组时,需要注意修改原数组中的元素的属性,因为它会影响拷贝之后连接的数组。
注意点:不过 concat 只能用于数组的浅拷贝,使用场景比较局限。
4. slice 拷贝数组
语法为:arr.slice(begin, end);
slice 方法会返回一个新的数组对象,这一对象由该方法的前两个参数来决定原数组截取的开始和结束时间,是不会影响和改变原始数组的。
注意点:slice 方法也比较有局限性,因为它仅仅针对数组类型。
限制
浅拷贝只能拷贝一层对象。如果存在对象的嵌套,那么浅拷贝将无能为力。因此深拷贝就是为了解决这个问题而生的,它能解决多层对象嵌套问题,彻底实现拷贝。
拓展
自己实现一个浅拷贝
大致的思路分为两点: 对基础类型做一个最基本的一个拷贝; 对引用类型开辟一个新的存储,并且拷贝一层对象属性。