深浅拷贝和直接复值

和原数据是否指向同一个地址第一层数据(基础类型数据)第二层数据(原数据中的再次使用引用类型的数据)
赋值会改变会改变
浅拷贝不会改变一起改变
深拷贝不会改变不会改变

直接赋值

let obj = { a: '1',b: { two: '2' }, c: '3'  }
let copyObj = {}
copyObj = obj
console.log(copyObj === obj) // true 说用两个引用类型指向同一个内存地址
copyObj.a = 'change'
obj.b.two = 'b-change'
console.log(copyObj, obj)
/*
copyObj 输出
{
a: "change"
b: {two: 'b-change'}
c: "3"
}
obj 输出
{
a: "change"
b: {two: 'b-change'}
c: "3"
}
*/

浅拷贝

方法

方法一: Object.assign()
方法二:展开运算符(…)
方法三:Array.prototype.concant()
方法四:Array.prototype.slice()
方法五:使用函数库loash的_clone方法
let obj = { a: '1',b: { two: '2' }, c: '3'  }
let copyObj = {}
copyObj = Object.assign({}, obj)
console.log(copyObj === obj) // false 说用两个引用类型指向不同的内存地址
copyObj.a = 'change'
obj.b.two = 'b-change'
console.log(obj, copyObj)
/*
obj 输出
{
a: "1"
b: {two: 'b-change'}
c: "3"
}
copyObj 输出
{
a: "change"
b: {two: 'b-change'}
c: "3"
}
*/

let arr = [1,2,3,{a: 4}]
let copyArr = []
copyArr = [...arr]
copyArr[1] = 100 copyArr[3].a = 400
consle.log(arr, copyArr)
/*
arr 输出
[1, 2, 3, {a: 400}]
copyArr 输出
[1, 100, 3, {a: 400}]
*/

深拷贝

方法

方法一:JSON.parse(JSON.stringify)

这种方法可以处理数组或者对象,但是不能处理函数和正则,因为已经处理之后,正则会变成一个空对象,函数会变成null

方法二: 函数库loash的_cloneDeep方法
方法三: JQuery.extend方法
let obj = { a: '1',b: { two: '2' }, c: '3'  }
let copyObj = {}
copyObj = JSON.parse(JSON.stringify(obj))
copyObj.a = 'change' copyObj.b.two = 'b-change'
console.log(obj, copyObj)
/*
obj 输出
{ a: '1',b: { two: '2' }, c: '3'  }
copyObj 输出
{ a: 'change',b: { two: 'b-change' }, c: '3'  }
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值