前端刷题-深浅拷贝

深拷贝

javascript 复制代码
function deepClone(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }

  if (obj instanceof Date) {
    return new Date(obj);
  }

  if (obj instanceof Array) {
    const cloneArray = [];
    for (let i = 0; i < obj.length; i++) {
      cloneArray[i] = deepClone(obj[i]);
    }
    return cloneArray;
  }

  if (obj instanceof Object) {
    const cloneObj = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        cloneObj[key] = deepClone(obj[key]);
      }
    }
    return cloneObj;
  }
}

在实际开发中通常不会这么使用深拷贝,ES6 中的 JSON.parse(JSON.stringify(obj))也可以用于深拷贝,但有一定的限制比如不能用于复制函数和循环引用

javascript 复制代码
function deepClone2(obj) {
  const cloneObj = JSON.parse(JSON.stringify(obj));
  return cloneObj;
}

验证

javascript 复制代码
const originalObject = {
  name: "John",
  age: 30,
  address: {
    city: "New York",
    country: "USA",
  },
  hobbies: ["reading", "traveling"],
};

const copiedObject = deepClone(originalObject);
console.log(copiedObject);

浅拷贝

javascript 复制代码
function shallowClone(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }

  if (obj instanceof Array) {
    const cloneArray = [];
    for (let i = 0; i < obj.length; i++) {
      cloneArray[i] = obj[i];
    }
    return cloneArray;
  }

  if (obj instanceof Object) {
    const cloneObject = {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        cloneObject[key] = obj[key];
      }
    }
    return cloneObject;
  }
}

浅拷贝与深拷贝的区别在于,深拷贝是层级式的将原数据完全拷贝成为一份新的数据,浅拷贝仅仅是对数据的第一层进行拷贝。当改变拷贝数据的深层数据时,浅拷贝会影响原数据而深拷贝不会影响原数据。

验证

javascript 复制代码
const originalObject = {
  name: "John",
  age: 30,
  hobbies: ["reading", "traveling"],
};

const copiedObject = shallowClone(originalObject);
console.log(copiedObject);

copiedObject.name = "Alice";
copiedObject.hobbies.push("swimming");

console.log(originalObject);
相关推荐
子兮曰3 分钟前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端
程序员黑豆9 分钟前
鸿蒙应用开发之@Styles 装饰器:定义可复用的组件样式
前端·harmonyos
程序员码歌11 分钟前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
咩咩啃树皮13 分钟前
第52篇:前端工程化完整体系精讲——Vite构建、模块化、打包原理、规范体系、面试终极通关
前端·面试·职场和发展
妙码生花13 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
前端·后端·ai编程
FogLetter15 分钟前
当JavaScript学会“分身术”:异步编程的进化简史
前端·javascript·面试
hunterandroid35 分钟前
[鸿蒙从零到一] HarmonyOS 分布式能力与设备协同实战:从发现设备到任务闭环
前端
lichenyang4531 小时前
从图片创作到本地可复现的 AIGC 全栈闭环:AIGC Creative Studio 实践复盘
前端·后端
牧艺1 小时前
别急着 Vibe Coding:AI 三小时写完需求后,我为什么宁愿多花一天
前端·agent·vibecoding
java1234_小锋1 小时前
Vue3+Vite简介以及构建第一个HelloWorld实例
前端·javascript·vue.js·vite