js 的深拷贝和浅拷贝整理

js 浅拷贝和深拷贝

ecmajcript 存在两种不同的数据类型的值 基本数据类型和引用数据类型

基本数据类型,键值对储存在栈内存中。(string,number,boolean, null,undefined)

引用数据类型,键存在与栈内存中,值存在与堆内存中。栈内存会提供一个指向堆内存的引用地址。(object, array)

概念简介

浅拷贝:指传址拷贝,拷贝的过程中只拷贝了存于栈中的地址,当修改拷贝对象时,由于指向地址相同,被拷贝对象也会改变。

深拷贝:相当于在堆中重新开辟空间,将拷贝对象堆中存储的所有数据存入新开辟的堆空间中,拷贝之后的对象相当于新对象,当被拷贝对象发生改变时拷贝对象不会改变。(深拷贝只针对结构比较复杂的object类型)

浅拷贝实现方法

for in 语句只会便利出对象第一层数据,如果对象有多层结构,则对象中的对象会是浅拷贝,只拷贝对象地址。

Object.assgin(target, source) object.assgin 有两个参数,第一个是目标对象,第二个参数是源对象,将源对象的所有属性分配给目标对象,并返回目标对象。

赋值,使用=赋值也属于浅拷贝。

对象的深拷贝实现方法

使用递归遍历拷贝所有的层级属性。(object.hasOwnProperty(key) 检测对象object中是否含有key,返回一个boolean值)

将object转换成json字符串,进行拷贝。利用JSON.Stringify(obj),然后使用JSON.parse()将json字符串转换成obj类型。(无法将对象中的function转换,function将会被识别为undefined。)

数组的深拷贝实现方法

使用扩展运算符实现深拷贝,

使用slice, concat对一维数组实现深拷贝。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值