JS深拷贝和浅拷贝(欢迎补充)

1.基本数据类型和引用数据类型:

①基本数据类型:(7种)Undefined、Null、Boolean、Number、String、Symbol、BigInt。

这些类型保存在变量中的值就是实际值,放在栈内存中,按值访问。

②引用数据类型:Object(对象)。

值放在堆内存中,按引用访问,操作的是对象的引用,而不是真正的对象。

2.复制基本数据类型和引用类型的值的区别:

①复制基本数据类型:a和b是相互独立的,改变彼此的值不会相互影响。复制的是真正的值。

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

②复制引用类型的值:a和b相互影响,改变一个变量的值,另一个也会跟着改变。因为复制的时候复制的是指针,而不是真正的值。

var a = {
    name: '小红',
    age: 18
}
var b = a // { name: '小红', age: 18 }
a.age = 16
console.log(a) // { name: '小红', age: 16 }
console.log(b) // { name: '小红', age: 16 }

3.浅拷贝:(引用类型)复制的是指针

①直接使用“=”符号复制,这样复制的就是指针,改变其中的一个,另一个也会跟着变。

②Object.assign():

当复制的对象只有一层结构时,相当于深拷贝(彼此没有联系)。

var a = {
    name: '小红',
    age: 18
}
var b = Object.assign({}, a) // { name: '小红', age: 18 }
b.age = 16
console.log(a) // { name: '小红', age: 18 }
console.log(b) // { name: '小红', age: 16 }

当复制的对象有多层结构时,第一层为深拷贝(彼此没有联系),从第二层开始为浅拷贝(改变其中的一个,另一个也会跟着改变)

var a = {
    name: '小红',
    age: 18,
    friend: {
        one: '看书'
    }
}
var b = Object.assign({}, a)
b.age = 16 // { name: '小红', age: 16, friend: { one: '看书' }}
b.friend.one = '听歌' // { name: '小红', age: 16, friend: { one: '听歌' }}
a.friend.one = '做饭' // { name: '小红', age: 18, friend: { one: '做饭' }}
console.log(a) // { name: '小红', age: 18, friend: { one: '做饭' }}
console.log(b) // { name: '小红', age: 16, friend: { one: '做饭' }}

③解构赋值同理。

4.深拷贝:(引用类型)复制的是数据的值,彼此不影响

JSON.parse(JSON.stringify()):

var a = {
    name: '小红',
    age: 18,
    friend: {
        one: '看书'
    }
}
var b = Object.assign({}, a)
b.age = 16 // { name: '小红', age: 16, friend: { one: '看书' }}
b.friend.one = '听歌' // { name: '小红', age: 16, friend: { one: '听歌' }}
a.friend.one = '做饭' // { name: '小红', age: 18, friend: { one: '做饭' }}
console.log(a) // { name: '小红', age: 18, friend: { one: '做饭' }}
console.log(b) // { name: '小红', age: 16, friend: { one: '听歌' }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值