浅拷贝

使用Object.assign将原对象的值分配给一个新对象

let obj = {
name: 'zzj'
age: '22'
}
// 要在Object.assign 重新定义一个{} 然后将obj复制到{}
let objCp = Object.assign({},obj)
// 修改objCp 的属性 不会影响原来的对象
objCp.age = '23'
console.log(objCp, obj) // { name: 'zzj', age: '23' } { name: 'zzj', age: '22' }
使用ES6的扩展运算符
let obj = {
name: 'zzj',
age: '22'
}
let objCp = {...obj}
objCp.age = '23'
console.log(objCp, obj) // 效果同上

深拷贝

使用使用Json.parse(Json.stringfy()) 缺点:不能拷贝源对象中 undefined 值和 方法
let obj = {
name: 'zzj',
age: 22,
girlFriend: undefined,
getName() {
return this.name
}
}
// 不能拷贝方法 和 undefined
let objCp = JSON.parse(JSON.stringify(obj))
objCp.name = 'sjj'
objCp.age = 23
console.log(objCp, obj)
// 结果
{ name: 'sjj', age: 23 } { name: 'zzj',
age: 22,
girlFriend: undefined,
getName: [Function: getName] }
编写一个深拷贝函数
// 编写一个函数
// 1. 判断传入的值是否是 对象 如果是进行拷贝,否则直接返回
// 2. 判断传入的值 是对象还是数组 给该值初始化{}或者[]
// 3.进行递归
// 深拷贝函数
function deepCp(data) {
// 判断是不是{}或者Array
if(typeof data === 'object' && data) {
// 判断该值是对象还是数组
let val = typeof data.length === 'number' ? [] : {}
for(let item in data) {
// 进行递归,对子项进行判断
val[item] = deepCp(data[item])
}
return val
}else {
return data
}
}
let obj = {
name: 'zzj',
age: 22,
girlFriend: undefined,
getName() {
return this.name
}
}
let objCp = deepCp(obj)
objCp.name = 'sjj'
objCp.age = 23
console.log(objCp, obj)
// 结果
{ name: 'sjj', age: 23 } { name: 'zzj',
age: 22,
girlFriend: undefined,
getName: [Function: getName] }