深拷贝与浅拷贝
浅拷贝:只是复制第一层属性;浅拷贝其实只是引用的拷贝,两者还是指向内存中的同一个地址。
深拷贝:通过递归的方式复制所有的属性;深拷贝就是两者指向不同的内存地址,是真正意义上的拷贝。
实现浅拷贝的方法
- 通过es6的解构方式进行拷贝
-
let newArr = [...arr]
- 通过es6引入的新方法进行拷贝【这里是将target后的多个对象全部合并到target对象中,并返回一个新的完整对象】
-
let newobj = Object.assign(target, ...others)
实现深拷贝的方法
- 通过递归的方式进行拷贝
-
function deepCopy(target,source){ for(let index in source){ if(typeof source[index] === "object"){ target[index] = {}; deepCopy(target[index],source[index]) }else{ target[index] = source[index]; } } } let b = {a:1,d:{b:1}}; let a = {}; deepCopy(a,b); a.d.b = 4; console.log(b)
- 通过JSON的方式进行拷贝
-
let newObj = JSON.parse(JSON.stringify(obj))
- 通过jQuery的extend方法实现深拷贝
-
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);
- Object.assign()拷贝
- 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
- lodash函数库实现深拷贝
lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝。