当前位置: 首页 > news >正文

js 对象深拷贝的五种方法

js 对象深拷贝


今天遇到一个bug ,子组件页面修改了内容,但是按了取消保存按钮,没有将数据传回父组件的,但是父组件的数据改了,原因是通过子组件接受父组件的参数对象层级深没有做深拷贝的原因。

在 JavaScript 中,深拷贝是指复制一个对象及其所有嵌套对象的完整副本,而不是仅仅复制引用。以下是几种实现深拷贝的方法:

方法 1:使用 JSON.parseJSON.stringify

这是最简单的方法,但有一些限制(例如,无法拷贝函数、undefinedSymbol 等)。

const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));

console.log(deepCopy); // { a: 1, b: { c: 2 } }

注意

  • 无法拷贝函数、undefinedSymbol
  • 不支持循环引用。

方法 2:使用递归实现深拷贝

手动实现一个递归函数来处理对象和数组。

function deepClone(obj) {
    if (obj === null || typeof obj !== "object") {
        return obj; // 基本类型直接返回
    }

    // 创建一个新对象或数组
    const copy = Array.isArray(obj) ? [] : {};

    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            copy[key] = deepClone(obj[key]); // 递归拷贝
        }
    }

    return copy;
}

const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const deepCopy = deepClone(obj);

console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }

方法 3:使用 lodash

lodash 是一个流行的 JavaScript 工具库,其中的 cloneDeep 方法可以轻松实现深拷贝。

import _ from "lodash";

const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const deepCopy = _.cloneDeep(obj);

console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }

优点

  • 支持复杂对象(如循环引用)。
  • 可靠且易用。

方法 4:使用 structuredClone(现代浏览器支持)

structuredClone 是一种原生方法,用于深拷贝对象。

const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const deepCopy = structuredClone(obj);

console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }

优点

  • 支持循环引用。
  • 原生方法,性能较好。

注意

  • 仅在现代浏览器和 Node.js 17+ 中支持。

方法 5:使用 Object.create 和递归

通过 Object.create 创建新对象,并递归拷贝属性。

function deepClone(obj) {
    if (obj === null || typeof obj !== "object") {
        return obj;
    }

    const copy = Object.create(Object.getPrototypeOf(obj));

    for (const key of Object.keys(obj)) {
        copy[key] = deepClone(obj[key]);
    }

    return copy;
}

const obj = { a: 1, b: { c: 2 }, d: [3, 4] };
const deepCopy = deepClone(obj);

console.log(deepCopy); // { a: 1, b: { c: 2 }, d: [3, 4] }

总结

  • 简单对象:可以使用 JSON.parse(JSON.stringify(obj)
  • 复杂对象:推荐使用 lodash.cloneDeepstructuredClone
  • 自定义实现:可以使用递归函数处理特殊需求。

相关文章:

  • java-IO流笔记
  • android 一步完成 aab 安装到手机
  • 【Qt】QByteArray详解
  • 【HTML 基础教程】HTML 属性
  • antd-vue Table组件翻页后保留上一页已选的数据
  • 比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取
  • Java 8-17核心特性全景解析之Java12
  • Spring IOC/DI的依赖注入方式及示例
  • 索引(重点)
  • 地理信息可视化技术大全【WebGIS 技术文档大全】
  • 科大讯飞语音转文字STT--unity
  • mysql死锁排查解决
  • Mysql 回表查询,什么是回表查询,如何拒绝sql查询时的回表问题
  • 【Django】教程-3-数据库相关介绍
  • C++中的判断与循环
  • Python 魔术方法功能分类指南
  • 十一、JavaScript简单数据类型和复杂数据类型
  • 材料科学基础:空间群与点群(1)
  • flutter 获取设备的唯一标识
  • 数仓开发那些事(11)
  • 佛山网站制作做多少钱/关键词推广工具
  • 人才市场招聘网站/百度关键词搜索排名帝搜软件
  • 哪些网站做的不好/下载百度极速版
  • 哪个网站上可以做代打/外贸网站建设案例
  • 动态网站开发与设计关键技术/东莞百度seo电话
  • 网站服务器租用需要注意的点/网络推广竞价外包