(1)浅拷贝【新旧对象共享同一块内存】
-
创建新对象
-
基本类型:拷贝基本类型的值
-
引用类型:拷贝指针(内存地址),不拷贝对象本身,其中一个对象改变地址,影响另一个对象
-
-
方法:
-
for-in遍历对象
-
展开运算符 ...
-
Object.assign()
-
使用lodash提供的函数 _.clone()
-
(2)深拷贝【新对象与原对象不共享内存】
-
完整拷贝对象,堆内存中开辟新区域,修改新对象不会影响原对象
-
方法:
【npm install loadsh】
-
使用lodash提供的函数 _.cloneDeep()
-
使用递归函数完成
-
function deepClone(oldObj) { // 判断当前要拷贝的是数组还是对象,新建空对象或者空数组 var newObj = Array.isArray(oldObj) ? [] : {} // 只能使用for-in,既可以遍历数组,也可以遍历对象 for (var k in oldObj) { // console.log(k, oldObj[k]) // 要被每一项放入到创建的新对象(数组) // 如果是原始类型的值,直接放入到新对象(数组),否则是引用类型的值,进行递归拷贝 if (typeof oldObj[k] === 'object') { newObj[k] = deepClone(oldObj[k]) } else { newObj[k] = oldObj[k] } } // 最后返回新对象(数组) return newObj }
-
使用JSON对象,先转字符串再转对象,JSON.parse(JSON.stringify())
-