深拷贝和浅拷贝
(1)浅拷贝【新旧对象共享同一块内存】
let a = {
age: 1
}
let b = a
a.age = 2
console.log(b.age) // 2====》如果给一个变量赋值一个对象,那么两者的值会是同 一个引用,其中一方改变,另一方也会相应改变
-
创建新对象
-
基本类型:拷贝基本类型的值
-
引用类型:拷贝指针(内存地址),不拷贝对象本身,其中一个对象改变地址,影响另一个对象
-
-
方法:
-
for-in遍历对象
-
展开运算符 ...
-
let a = {age: 1} let b = {...a} a.age = 2 console.log(b.age) // 1
-
-
Object.assign()
-
let a = {age: 1} let b = Object.assign({}, a) a.age = 2 console.log(b.age) // 1
-
-
使用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())
-