js语法浅拷贝及深拷贝

一、什么是拷贝

        拷贝就是复制,复制不同数据类型的代码。

二、两种数据类型及存放

1、栈

栈内存,存放简单数据类型和引用类型指针。

2、堆

堆内存,存放应用数据类型。

3、简单数据类型

简单数据类型分为:字符串、、数字型、null、undefind、布尔值。

简单数据类型存放在栈里

拷贝

简单数据类形就是将: 变量1赋值给变量2,从而实现拷贝。

let num1 = "哈哈"
let num2 = num1
console.log(num1,num2)//哈哈 哈哈
4、复杂数据类型

复杂数据类型分为:数组、对象。 

三、浅拷贝

指创建一个新的对象或数组,并将原始对象或数组的值复制到新对象或数组中的过程。浅拷贝只复制对象或数组的引用,而不是复制其内部的子对象或子数组。

三种方法

1、扩展运算符(...)

扩展运算符可以创建一个新的数组或对象,并将原始数组或对象的所有属性复制到新的数组或对象中。

        let obj = {
            a: {name: 'abc'},
            b: 2
        }
        let newObj = {}
        newObj.a=obj.a
        newObj.b=obj.b

2、Object.assign()

Object.assign() 方法可以将一个或多个源对象的属性复制到目标对象中,并返回目标对象。这也可以用于浅拷贝对象。

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

3、Array.slice()

对于数组,可以使用 slice() 方法创建一个新的数组,并将原始数组的元素复制到新数组中。

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

注意:

浅拷贝只能复制一层对象或者数组。若包含一个数组或者对象则不能拷贝到。要用到深拷贝。

四、深拷贝

创建一个全新的对象或数组,并完全复制原始对象或数组的所有值和嵌套的子对象或子数组。深拷贝不仅复制了对象或数组本身,还会递归地复制其所有嵌套的子对象或子数组,确保新创建的对象或数组与原始对象或数组完全独立,没有任何引用关系。

两种方法:

1、递归

递归地遍历原始对象或数组的属性或元素,并创建相应的新对象或数组。对于每个嵌套的子对象或子数组,再次调用深拷贝函数进行递归复制。这样可以确保所有的嵌套层级都被复制。

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj; // 非对象或 null 直接返回
  }
  
  let newObj = Array.isArray(obj) ? [] : {};
  
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepCopy(obj[key]);
    }
  }
  
  return newObj;
}

// 示例
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'music'] };
const newObject = deepCopy(originalObject);

2、第三方库

Lodash库,cloneDeep()方法 复制一个对象或数组,并创建一个全新的对象或数组,确保复制后的对象或数组与原始对象或数组完全独立

const _ = require('lodash');

// 示例
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'music'] };
const newObject = _.cloneDeep(originalObject);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值