浅拷贝与深拷贝的区别。如何实现深拷贝。

本文探讨了数据类型的区分,重点讲解了浅拷贝和深拷贝的概念,浅拷贝包括Object.assign()、Array.prototype.concat()、for in及扩展运算符等实现方式,而深拷贝则介绍了JSON.parse(JSON.stringify())方法和递归实现。浅拷贝仅复制第一层属性,而深拷贝对引用类型进行递归复制,确保修改拷贝对象不影响源对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于拷贝应该是大家面试中经常被问到的问题,特此总结一下,为以后积累经验。

1,数据类型

巩固拷贝之前必须先回顾下数据的分类,知道其存储的位置。

基本数据类型:
1)分类 (String Number Boolean Undefined Null Symbol)
2)特点(数据存在栈内存中)

引用数据类型:
1)分类 (Object)
2)特点(栈内存中存的是指向堆内存中数据对象的一个地址值,可以理解成是一个指针。当寻找引用类型的值时,会先在栈内存中找到指针,然后堆内存中找到该引用对象。)

2,浅拷贝和深拷贝

何为拷贝:简易理解为重新复制一份数据。
浅拷贝和深拷贝主要针对引用类型数据而言。基本类型数据都是拷贝的栈内存中的值,改变拷贝后的值对原值不会产生影响。

赋值:
不产生新对象,当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。两个对象指向同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容。

var a = 1;
var b = a;
b = 2;
console.log(a) //1
console.log(b) //2

var obj = {
   
   
    name: '小明',
    age: 18,
    eat: [1,[2,3],[4,5,6]]
}
var obj1 = obj
obj1.name = '小明1'
obj1.eat[1] = [1,1]
console.log('obj',obj) //{ name: '小明1', age: 18, eat: [ 1, [ 1, 1 ], [ 4, 5, 6 ] ] }
console.log('obj1',obj1) //{ name: '小明1', age: 18, eat: [ 1, [ 1, 1 ], [ 4, 5, 6 ] ] }

浅拷贝:
产生新对象,如果被拷贝对象的属性中有引用类型的值,则拷贝的是数据在堆内存中的地址值,通过拷贝后得到的变量修改数据,源对象中的数据发生改变
即浅拷贝只复制对象的第一层属性。

var obj2 = {
   
   
    name: '小明',
    age: 18,
    eat: [1,[2,3],[4,5,6]]
}
var obj3 = clone(obj2)
obj3.name = '小明1'
obj3.eat[1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值