js 的 数据引用之对象

本文详细讲解了JavaScript中对象赋值的引用规则,指出对象赋值实际上是引用赋值,导致数据可能互相影响。为避免这种情况,介绍了三种实现数据复制的方法:Object.assign()、直接属性赋值以及通过JSON转换。每种方法的优缺点和适用场景都有所阐述,特别是强调了浅拷贝的问题,并提醒在处理复杂对象时需注意深拷贝的需求。
摘要由CSDN通过智能技术生成

js 的 数据引用之对象

对象的引用规则

在脚手架中,对象的赋值如:

const params = {test: 1,target:2} 
const target = params
console.log(parmas,target)

//{test1: 1,test2:2}  {test1: 1,test2:2} 

target.test1 = 4
console.log(parmas,target)

//{test1: 4,test2:2}  {test1: 4,test2:2} 

由此可见,对象的赋值,其实是引用,而不是赋值,和C和C++中的数组的传递一样。

js 对象的赋值

由上面可见。为了保证数据的互不干扰,我们不希望使用对象的引用,而是使用,数据复制的形式,来对数据进行处理,这样可以规避数据的相互影响。

方式一: 使用方法Object.assign(target,source)
js提供了方法:Object.assign(target,source),可以将枚举对象进行扩充。如:

const target = {}
const source = {a:1,b:2}
Object.assign(target,source)

console.log(target)
//target = {a:1,b:2}

console.log(source)
//source = {a:1,b:2}

target.a = 2

console.log(target)
//target = {a:2,b:2}

console.log(source)
//source = {a:1,b:2}

这样,就可以避免数据的相互干扰。
当然,不建议使用这个方法
它只能实现一层的深拷贝,也就说,当你需要拷贝的对象的属性中,有对象的话,那么,你最后得到的结果。会有问题。
总的来说,这个也是一个浅拷贝,不仅如此,基本上直接提供给你的拷贝方式都是浅拷贝。

方法二: 直接赋值
直接将对象一一赋值,如:

const source = {a:1,b:2}
const target = {a:source.a,bsource.b}

console.log(target)
//target = {a:1,b:2}

console.log(source)
//source = {a:1,b:2}

target.a = 2

console.log(target)
//target = {a:2,b:2}

console.log(source)
//source = {a:1,b:2}

方法三: 类型转化
在js中,String 类的赋值,是从新开辟内存,所以,我们可以通过类型转化来实现。如:

const source = {a:1,b:2}
const target = JSON.stringify(source)
console,log(target)
//{"a":1,"b":2}
const result = JSON.parse(target)

console.log(result)
//target = {a:1,b:2}

result.a = 2

console.log(result)
//result= {a:2,b:2}

console.log(source)
//source = {a:1,b:2}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值