原生js中的深浅拷贝笔记

深浅拷贝,是我们在处理数据中一定会遇到的问题,浅拷贝是引用地址的拷贝,主要是针对object类型,新数据和原始数据会相互影响。深拷贝是值的拷贝,是单独一个内存空间,不会互相影响。

浅拷贝

js 复制代码
import clone from "/node_modules/lodash-es/clone.js";
import cloneDeep from "/node_modules/lodash-es/cloneDeep.js";

const obj = {
  name: "zs",
  age: 18,
  sex: "男",
  address: {
    province: "北京",
    city: "海淀",
  },
};
js 复制代码
/**
 * 浅拷贝
 */
const o = obj;
o.name = "ls";
console.log(o);
console.log(obj);
js 复制代码
/**
 * 浅拷贝
 */
const o = clone(obj);
o.name = "ls";
o.address.province = "上海";
console.log(o);
console.log(obj);
js 复制代码
// concat() 方法用于连接两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
// 但是是一个浅拷贝,如果数组中包含引用类型,则两个数组中该位置的元素是同一个对象
import cloneDeep from "/node_modules/lodash-es/cloneDeep.js";
const arr1 = [1, 2, 3];
const arr2 = [4, 5];

const arr3 = arr1.concat(arr2);
console.log("🚀 ~ arr3:", arr3);
arr2.push(6);
console.log("🚀 ~ arr2:", arr2);
console.log("🚀 ~ arr3:", arr3);



const arr1 = [1, 2, 3];
const arr2 = [4, 5, { name: "张三" }];

const arr3 = arr1.concat(arr2);
console.log("🚀 ~ arr3:", arr3);
arr2[2].name = "李四";
console.log("🚀 ~ arr2:", arr2);
console.log("🚀 ~ arr3:", arr3);

// 深拷贝
const arr4 = cloneDeep(arr1.concat(arr2));
arr2[2].name = "李四";
console.log("🚀 ~ arr4:", arr4);
console.log("🚀 ~ arr2:", arr2);
```js

//浅拷贝
const o = { ...obj };
o.address.province = "山东";
o.name = "zxy";
console.log("🚀 ~ o:", o);
console.log("🚀 ~ obj:", obj);


const o1 = {};
Object.assign(o1, obj);
o1.address.province = "山东";
console.log("🚀 ~ obj:", obj);
console.log("🚀 ~ o1:", o1);

深拷贝,lodash里面的方法

js 复制代码
//深拷贝
const o = cloneDeep(obj);
o.address.province = "山东";
o.address.city = "济南";
console.log("🚀 ~ obj:", obj);
console.log("🚀 ~ o:", o);

递归,封装深拷贝

js 复制代码
function fn(num = 5) {
  if (num === 0) return;
  console.log(num);
  fn(--num);
}
fn();

function time() {
  console.log(new Date().toLocaleTimeString());
  setTimeout(time, 1000);
}

 time();

//浅拷贝
const obj = {
  name: "张三",
  age: 20,
  hobby: ["篮球", "足球"],
  address: {
    province: "广东省",
    city: "广州市",
  },
};
const o = {};

// for (let key in obj) {
//   o[key] = obj[key];
// }
// o.hobby.push("羽毛球");
// console.log("🚀 ~ o:", o);
// console.log("🚀 ~ obj:", obj);

//深拷贝
function deepClone(target, source) {
  for (let key in source) {
    if (source[key] instanceof Array || source[key] instanceof Object) {
      target[key] = source[key].constructor === Array ? [] : {};
      deepClone(target[key], source[key]);
    } else {
      target[key] = source[key];
    }
  }
}

// 深拷贝
// deepClone(o, obj);
// o.hobby.push("羽毛球");
// console.log("🚀 ~ o:", o);
// console.log("🚀 ~ obj:", obj);

深拷贝JSON.parse(JSON.stringify(obj));

js 复制代码
const o2 = JSON.parse(JSON.stringify(obj));
js 复制代码
const o2 = {};
deepClone(o2, obj);
obj.hobby.push("羽毛球2222");
obj.address.city = "深圳";
console.log("🚀 ~ o2:", o2);
console.log("🚀 ~ obj:", obj);

参考结果


相关推荐
@PHARAOH5 分钟前
HOW - 构建一个轻量前后端一体服务
前端·微服务·服务端
无限进步_16 分钟前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
一只小小Java17 分钟前
Echarts单表多图实现
前端·javascript·echarts
跟着珅聪学java17 分钟前
Element UI 的 Tabs 标签页开发教程
javascript·vue.js·elementui
dunky26 分钟前
Spring AI 深度解析:把 LLM 抽象成 Spring Bean 的底层逻辑
前端
星栈27 分钟前
Rust WASM 文件上传全链路:从浏览器到 S3,一个字节都不能少
前端·前端框架·开源
濮水大叔27 分钟前
告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染
前端·typescript·node.js
JarvanMo28 分钟前
Flutter 3.44 & Dart 3.12重磅发布!这些新特性太香了
前端
竹林81828 分钟前
用Viem替换ethers.js:一次合约交互的"减负"实战,我总算把TypeScript类型搞明白了
前端·javascript
To_OC29 分钟前
一个让我懵了半小时的时钟 Bug,注重前端三权分立落地
前端·代码规范