JS深拷贝和浅拷贝

平常在写代码时经常会用到拷贝函数,谈到拷贝,我们要理解js数据储存位置,栈和堆, 简单数据类型会储存在栈内存中, 复杂数据类型会存在堆内存中, 给对象直接赋值另一个对象,不是拷贝内容,而是把对象在栈内存中的地址值赋给了新对象

当我们拷贝简单数据类型时,只用浅拷贝就可以获得一个数据相同但是,和原数据互不相干的新数据

数据浅拷贝

数据浅拷贝大致有三种方法

1. 扩展运算符(…)

条件:数组内不包含复杂数据类型

const originalArray = [1, 2, 3]; const shallowCopyArray = [...originalArray];

2. Array.prototype.slice() 数组的slice(方法)

数组的slice传参就是截取数组中某一段,不传参数会返回一个与原数组属性相同的新数组 条件:数组内不包含复杂数据类型

const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.slice();

3. Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象source复制到目标对象。它将返回目标对象target

const originalObject = { name: "John", age: 30 };
const shallowCopyObject = Object.assign({}, originalObject);

深拷贝

1. 使用JSON序列化和反序列化

onst originalObject = { name: "John", age: 30 };
const deepCopyObject = JSON.parse(JSON.stringify(originalObject));

使用json序列化会把数据平铺开

注意:使用这种方法进行深拷贝时,需要确保对象或数组中不包含循环引用,否则会导致无限循环。

2. 递归复制

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  let copy = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      copy[key] = deepCopy(obj[key]);
    }
  }

  return copy;
}

const originalObject = { name: "John", age: 30 };
const deepCopyObject = deepCopy(originalObject);

以上是常见的浅拷贝和深拷贝的实现方法,根据情况选择适合的方式进行对象和数组的复制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值