javascript中的深浅拷贝

说到js中的深浅拷贝,首先我们要知道js中有两种数据类型,值类型和引用类型,值类型的数据存储于栈。而引用类型存储于堆中,在栈中的只是一个引用地址。如图
在这里插入图片描述
在这里插入图片描述
然后上代码

//值类型
let a = 100;
let b = a;
a = 200;
console.log(b); //100
//引用类型
let a = { age: 20 }; //a存的是一个引用地址
let b = a; //b相当于存了一个引用地址与a是同一个地址
b.age = 21;
console.log(a); //21

深拷贝就是为了解决引用类型,如上a的对象赋给b,b更改了对象中的值,由于a和b都是引用的同一个地址,所以a中的age也变了,但是通过深拷贝给b拷贝a,之后进行更改b,这是a还会是原来的值。
深拷贝代码如下,采用的递归:

/**
 *
 *深拷贝
 * @param {Object} obj要拷贝的对象
 * @return {*}
 */
function deepClone(obj = {}) {
    console.log(typeof obj)
  if (typeof obj !== "object" || obj == null) {
    // obj 是null 或者不是对象和数组,直接返回
    return obj;
  }

  let result;

  if (obj instanceof Array) {
    //利用 instanceof 判断是不是数组
    result = [];
  } else {
    result = {};
  }
  for (const key in obj) {
    //hasOwnProperty 保证传入的 key 不是原型的属性
    if (obj.hasOwnProperty(key)) {
      //递归调用
      result[key] = deepClone(obj[key]);
    }
  }

  //返回结果
  return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值