js 浅拷贝直接赋值_JS对象赋值和浅拷贝的区别是什么?

赋值和浅拷贝的区别

一直以为对象赋值和对象浅拷贝是一样的,但实际上它们还是有很大差异。

先看赋值,将一个对象赋值给一个新的对象的时候,赋的其实是该对象在栈中的地址,而不是堆中的数据。

也就是一个对象的改变就会改变另外一个对象。

再看浅拷贝,浅拷贝会创建一个对象,再去遍历原始对象,如果原对象的属性值是基础类型,那么就拷贝基础类型,如果是引用类型,则拷贝的是指针。

是不是有点蒙蔽?

看一个例子:var obj1 = {

name: '前端大杂货铺',

content: ['前端', '生活']

}

// 赋值

var obj2 = obj1

obj2.name = 'Gping'

obj2.content[2] = '感悟'

console.log(obj1, obj2)

var obj1 = {

name: '前端大杂货铺',

content: ['前端', '生活']

}

// Object.assign 是浅拷贝

var obj3 = Object.assign({}, obj1)

obj3.name = 'Gping'

obj3.content[2] = '感悟'

console.log(obj1, obj3)

obj1 是源对象,obj2 是赋值得到的,obj3 是浅复制得到的,如果我们改变的第一层数据不管是原始类型还是引用类型,那么 obj2 的改变都会导致 obj1 的改变。

obj3 如果第一层数据改变的是原始类型,那么不会影响源数据,改变的是引用类型数据,则会影响 obj1 的改变。

关于赋值,还有一个很基础的点,很惭愧,之前竟然理解错了。上代码var a = {};

b = a;

b = {}; // 这里 b 已经指向了新的地址,和 a 已经没有任何关系了。跟new Object()应该是一样的

a.name = 'Gping';

console.log(b); // {}

个人理解,通过对象表达式的方式创建一个对象,就已经指向新的地址的,也就是跟之前指向的地址已经没有关系了

总结

赋值和浅拷贝的区别在于对象第一层数据对原对象的影响,如果是赋值,改变会直接影响原对象。如果是浅拷贝,而且属性值是基础类型的话,就不会影响原对象。属性值为引用类型,就会影响原对象本文转载自:https://juejin.im/post/6844904046843674631

作者:Gopal

想要了解更多相关知识,可访问 前端学习网站!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值