如何深拷贝对象_javascript中有哪些方法?

深拷贝对象需创建完全独立的副本,JSON.parse(JSON.stringify())最常用但有类型限制;structuredClone()是现代推荐方案,支持循环引用和多数内置类型;手写递归函数或Lodash的_.cloneDeep()适用于特殊需求。

如何深拷贝对象_javascript中有哪些方法?

深拷贝对象就是创建一个全新的对象,所有嵌套的属性和值都完全独立,修改副本不会影响原对象。直接用 =Object.assign() 都只是浅拷贝,遇到嵌套对象就失效。

JSON.parse(JSON.stringify()) —— 最常用但有局限

这是最简单快捷的方式,适合纯数据对象(只含字符串、数字、布尔、null、数组、普通对象):

能处理多层嵌套,自动递归复制 不支持函数、undefined、Symbol、Date、RegExp、Map、Set、BigInt 等类型,这些会被忽略或转成 null 遇到循环引用会直接报错 TypeError: Converting circular structure to JSON

例子:
const copy = JSON.parse(JSON.stringify(original));

structuredClone() —— 新标准,推荐优先用

现代浏览器(Chrome 98+、Firefox 94+、Edge 98+)已支持,是官方推荐的深拷贝方案:

支持 Date、RegExp、Map、Set、ArrayBuffer、TypedArray、Error 等大多数内置类型 能正确处理循环引用(自动识别并复用已有引用) 不支持函数、undefined、Symbol(和 JSON 方式一样,但报错更明确)

例子:
const copy = structuredClone(original);

手写递归函数 —— 完全可控,适合特殊需求

当需要支持函数、Symbol、自定义类,或要过滤/转换某些字段时,就得自己实现:

立即学习“Java免费学习笔记(深入)”;

核心逻辑:判断类型 → 对象/数组就递归遍历 → 基础类型直接返回 用 WeakMap 记录已拷贝的对象,解决循环引用问题 可扩展:加入对 Date、RegExp、Map、Set 的单独处理逻辑

简单示意(不含循环检测):

function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepClone(obj[key]);
}
}
return copy;
}

Lodash 的 _.cloneDeep() —— 工程项目稳妥选择

如果项目已引入 Lodash,直接用它最省心:

覆盖几乎所有 JS 数据类型,包括函数(会保留)、Symbol、自定义类实例等 内部做了大量边界处理,比如原型链、不可枚举属性、循环引用 体积稍大,纯前端小项目可考虑按需引入或换其他轻量方案

例子:

import { cloneDeep } from 'lodash-es';
const copy = cloneDeep(original);

基本上就这些。日常开发优先用 structuredClone();兼容老浏览器就用 JSON 方法(确认数据干净);需要精细控制或兼容性要求高,再上手写或用 Lodash

以上就是如何深拷贝对象_javascript中有哪些方法?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
javascript localStorage怎样使用_它存储的数据有安全风险吗?
上一篇 2025年12月21日 15:27:25
为什么JavaScript的事件循环如此重要_它如何处理异步任务?
下一篇 2025年12月21日 15:27:43

相关推荐

  • Java中如何实现线程安全的单例模式

    饿汉式简单但可能浪费资源;2. 懒汉式双重检查锁定需volatile保证线程安全;3. 静态内部类实现懒加载且线程安全;4. 枚举方式最推荐,防反射和反序列化破坏。 在Java中实现线程安全的单例模式,关键在于确保多线程环境下实例只被创建一次。下面介绍几种常用且有效的实现方式。 1. 饿汉式(静态常…

    2026年9月8日
    000
  • laravel如何处理表单验证和错误信息_Laravel表单验证与错误处理教程

    Laravel通过validate()方法实现表单验证,失败时自动重定向并闪存错误信息。示例中在控制器使用$request->validate()定义规则,如’name’必填、’email’唯一等,验证通过后保存数据。视图中用@error指令显示…

    2026年9月8日
    400
  • VSCode文档符号解析器实现

    首先实现DocumentSymbolProvider接口的provideDocumentSymbols方法,再通过正则或解析器提取代码结构,最后将函数、类等符号转为支持嵌套的DocumentSymbol对象并返回。 VSCode 的文档符号解析器(Document Symbol Provider)允…

    2026年9月8日
    000
  • 在Java中如何实现多线程文件下载

    答案是通过分段下载和多线程并发实现高效文件下载:先发送HEAD请求获取文件大小,确认服务器支持Range,按线程数划分字节范围,每个线程用HttpURLConnection设置Range头下载对应段,借助RandomAccessFile定位写入,避免冲突;所有线程完成后无需额外合并,利用CountD…

    2026年9月8日
    000
  • 实现PHP框架的中间件功能_基于Laravel的php框架怎么用的开发

    中间件是Laravel中用于过滤HTTP请求的机制,可处理认证、权限、日志等任务。它位于请求与应用逻辑之间,通过全局、路由或分组方式注册使用。使用Artisan命令可创建中间件,如CheckAge,用于检查年龄并重定向。中间件需在Kernel.php中注册,并绑定到路由或分组。支持参数传递,如角色验…

    2026年9月8日
    100
  • 编码面试解题助手— 开源的AI编程辅助工具

    编码面试解题助手— 开源的AI编程辅助工具编码面试解题助手— 开源的AI编程辅助工具编码面试解题助手— 开源的AI编程辅助工具编码面试解题助手— 开源的AI编程辅助工具

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 白瓜面试 白瓜面试 – AI面试助手,辅助笔试面试神器 40 查看详情 编码面试解题助手 编码面试解题助手是一款专为中文用户设计的编程辅助#%#$#%@%@%$#%$#%#%#$%@…

    2026年9月8日 用户投稿
    000
  • VSCode怎么边写边保存_VSCode开启自动保存与延时保存功能教程

    开启VSCode自动保存需在文件菜单中选择“自动保存”并启用After Delay模式,再通过设置调整files.autoSaveDelay值(默认2000毫秒)以平衡保存频率与性能,推荐从2秒开始根据习惯微调,确保工作成果及时保存且避免频繁IO。 在VSCode里实现边写边保存,其实很简单,核心就…

    2026年9月8日
    000
  • php-gd怎样设置画笔颜色_php-gd图像前景颜色设定

    使用imagecolorallocate()函数为GD图像分配颜色标识符以设置画笔颜色,示例中创建真彩色图像并分配红色(255,0,0)绘制线条,注意事项包括:颜色需在绘图前分配,同一颜色可复用变量管理,调色板模式下应控制颜色数量,透明色需用imagecolorallocatealpha(),切换画…

    2026年9月8日
    000
  • 俄罗斯搜索引擎Yandex官方首页入口 Yandex免登录可用链接最新分享

    在此为大家分享Yandex搜索引擎官方首页的最新可用链接。该链接 无需登录、无需注册,点击即可直接使用,让您轻松访问这个功能强大的搜索引擎。 很多朋友都在寻找Yandex官方首页的免登录链接,为了方便大家,我们整理了详细的访问指南和功能介绍,希望能帮助您更好地利用这款工具。 1、立即进入“☞☞☞☞点…

    2026年9月8日
    000
  • 怎么使用VSCode写JS_VSCode编写JavaScript代码与智能提示配置教程

    答案:配置jsconfig.json、使用ESLint和Prettier、合理设置调试模式可显著提升VSCode中JavaScript开发效率。通过jsconfig.json优化模块解析与类型检查,结合扩展实现代码规范与自动格式化,并利用launch.json配置断点、条件断点及attach模式调试…

    2026年9月8日
    000
  • 谷歌浏览器如何禁用网站的摄像头和麦克风权限_谷歌浏览器禁用摄像头麦克风权限方法

    首先可通过谷歌浏览器设置管理网站对摄像头和麦克风的访问权限。具体操作包括:针对单个网站,在地址栏点击锁形图标进入“网站设置”,将摄像头和麦克风权限由“允许”改为“禁止”;若要全局阻止,进入“设置”→“隐私和安全”→“网站设置”,将摄像头和麦克风的默认行为均设为“不允许”;如需撤销已授权网站的权限,可…

    2026年9月8日
    200
  • 超星官网登录入口网页版 超星官网登录入口网页版在线登录

    超星官网登录入口为https://www.chaoxing.com,支持手机号验证码、单位账号、邮箱密码及学习通APP扫码登录,提供学术视频、名师讲座、出版社合作资源及授权作品等丰富内容,界面简洁,推荐使用谷歌浏览器并支持多端同步。 超星官网登录入口网页版在线登录地址在哪里?这是不少网友都关注的,接…

    2026年9月8日
    100
  • Laravel中处理同一表单内多个提交按钮的策略

    本教程将详细介绍在laravel应用中,如何有效区分和处理来自同一html表单的多个提交按钮。通过为提交按钮设置独特的`name`和`value`属性,开发者可以在后端控制器中轻松判断用户点击了哪个按钮,从而执行不同的业务逻辑,例如更新数据或删除记录,确保操作的准确性和灵活性。 在Web开发中,我们…

    2026年9月8日
    000
  • PHP字符串中解析关联数组值的语法深度解析

    本文深入探讨了php在双引号字符串中解析关联数组值时,为何需要使用复杂(花括号)语法。通过对比索引数组和关联数组的解析机制,解释了php简单语法在处理带引号的关联数组键时可能导致的歧义,并详细阐述了复杂语法的优势及其在解决此类问题中的应用。文章还提供了示例代码,帮助读者理解不同语法的使用场景和最佳实…

    2026年9月8日
    000
  • Java中基于自定义链表栈的括号平衡性检查指南

    本教程深入探讨了如何利用自定义实现的链表栈来高效、准确地判断括号表达式的平衡性。文章首先剖析了传统两栈方法的不足,随后详细阐述了业界普遍采用的单栈算法原理,并提供了完整的java代码实现及使用示例。通过本指南,读者将掌握栈在解决结构匹配问题中的核心应用,并能构建健壮的括号平衡性检查逻辑。 引言:括号…

    2026年9月8日
    000
  • VSCode怎么打开ASP页面_VSCode配置ASP.NET环境与页面调试教程

    答案:VSCode需配置.NET SDK、launch.json及安装C#等扩展才能调试ASP页面。首先安装.NET SDK并确保终端可识别dotnet命令,随后在VSCode中安装C#扩展以支持语法高亮与调试。通过创建并配置launch.json文件,指定程序入口、工作目录及环境变量,实现本地调试…

    2026年9月8日
    000
  • Java静态代理和动态代理在实现上有何差异

    静态代理在编译期手动编写代理类,代理类与目标类实现同一接口,扩展性差;动态代理在运行时通过反射机制自动生成代理对象,JDK动态代理基于接口,CGLIB通过继承实现,灵活性高,适用于统一处理横切逻辑,是Spring AOP的基础。 静态代理和动态代理的核心区别在于代理类的生成时机和实现方式。静态代理在…

    2026年9月8日
    100
  • safari浏览器如何安装扩展插件_safari浏览器扩展插件安装方法

    可通过App Store安装官方扩展,如AdGuard或1Password,确保安全性和兼容性;也可手动启用可信的第三方扩展,需在系统设置中允许并开启;开发者可启用本地测试扩展,通过开发菜单加载未签名插件用于调试。 如果您在浏览网页时希望增强Safari浏览器的功能,例如屏蔽广告、管理密码或提升隐私…

    2026年9月8日
    100
  • 如何为iPhone14ProMax下载最新固件?完整步骤解析

    首先通过iTunes/Finder或第三方工具下载固件,再手动刷入iPhone 14 Pro Max以完成系统更新,适用于无线更新失败场景。 如果您尝试为您的iPhone 14 Pro Max升级系统,但无法通过无线方式完成更新,则可能是由于需要手动下载并刷入固件。以下是解决此问题的步骤: 本文运行…

    2026年9月8日
    000
  • 在Spring Boot中配置多个Quartz定时任务

    本文详细介绍了如何在spring boot应用中配置并管理多个quartz定时任务。通过创建独立的job类、jobdetailfactorybean和simpletriggerfactorybean,并利用spring的依赖注入机制将这些任务和触发器集合注入到schedulerfactorybean…

    2026年9月8日
    000

发表回复

登录后才能评论
关注微信