前端刷题-深浅拷贝

深拷贝

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);
相关推荐
kyriewen1141 分钟前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
Old Uncle Tom42 分钟前
Markdown Viewer 再升级
前端
Luna-player44 分钟前
Vue3中使用vue-awesome-swiper
前端·vue.js·arcgis
SuperEugene1 小时前
Vue3 Pinia 状态管理规范:状态拆分、Actions 写法、持久化实战,避坑状态污染|状态管理与路由规范篇
前端·javascript·vue.js·前端框架·pinia
black方块cxy1 小时前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端
@PHARAOH1 小时前
WHAT - AI 时代下的候选人
大数据·前端·人工智能
竹林8182 小时前
从零到一:我在Solana NFT铸造前端中搞定@solana/web3.js连接与交易
前端·javascript
猪八宅百炼成仙2 小时前
不用点击也能预览图片:Element UI ImageViewer 命令式调用方案
前端
尘世中一位迷途小书童2 小时前
前端工程化基石:package.json 40+ 字段逐一拆解
前端·javascript·架构
OpenTiny社区2 小时前
WebMCP + WebSkills:企业级智能化页面操控方案,兼顾隐私安全与高效落地!
前端·ai编程·mcp