前言
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝和深拷贝的区别
浅拷贝引用类型其中一个对象改变了地址,就会影响另一个对象。
深拷贝改变新对象不会影响原对象,他们之间互不影响。
浅拷贝和深拷贝的实现
浅拷贝:
1、Object.assign():此方法用于将一个或多个源对象的所有可枚举的自有属性复制到目标对象。它会返回目标对象。这样可以实现浅拷贝,但需要注意的是,它不会拷贝对象的继承属性和不可枚举的属性。
2、扩展运算符:这是ES6引入的特性,可以用于对象和数组。使用扩展运算符进行浅拷贝与Object.assign()类似,也是只拷贝一层属性。
3、Array.prototype.slice():此方法返回一个新数组,包含原数组的一个子集。当不传递参数时,它默认从0开始拷贝到数组末尾,从而实现浅拷贝。
4、Array.prototype.concat():此方法用于合并两个或多个数组,并返回一个新数组。不改变原始数组。当传递空参数时,它可以用来创建一个原数组的浅拷贝。
深拷贝:
1、利用递归:这种方法适用于对象和数组的深拷贝。通过判断数据类型,如果是对象或数组,则进行递归复制,否则直接复制属性。
2、使用JSON.parse(JSON.stringify()):将对象转换为JSON字符串,然后再将该字符串解析为新的对象。但此方法不能拷贝undefined、function和循环引用。
3、使用lodash的_.cloneDeep方法:lodash是一个JavaScript实用程序库,提供了_.cloneDeep方法用于实现深拷贝。
4、通过jQuery的extend方法:当向extend方法传递true作为第一个参数时,可以实现深拷贝效果。