阿里巴巴网站建设的态度虚心/网络媒体推广产品

阿里巴巴网站建设的态度虚心,网络媒体推广产品,美容 北京 公司 网站建设,醴陵市建设局网站在 JavaScript 中,深浅拷贝是处理对象复制的重要概念。它们的核心区别在于对 引用类型数据 的处理方式,理解这一点对避免程序中的意外数据污染至关重要。 一、核心概念解析 1. 基本类型 vs 引用类型 基本类型:Number, String, Boolean, null…

在 JavaScript 中,深浅拷贝是处理对象复制的重要概念。它们的核心区别在于对 引用类型数据 的处理方式,理解这一点对避免程序中的意外数据污染至关重要。


一、核心概念解析

1. 基本类型 vs 引用类型
  • 基本类型Number, String, Boolean, null, undefined, Symbol, BigInt
    直接存储在栈内存中,复制时创建独立副本。

  • 引用类型Object, Array, Function, Date, RegExp
    栈内存存储指针,堆内存存储实际数据,复制时默认只复制指针。

2. 赋值 vs 浅拷贝 vs 深拷贝
操作类型特点是否共享引用
直接赋值复制指针,完全共享数据
浅拷贝创建新对象,但嵌套引用类型仍共享嵌套层级共享 ✅
深拷贝完全独立的新对象,所有层级不共享

二、浅拷贝实现方案

1. 手动实现
function shallowCopy(obj) {if (typeof obj !== 'object' || obj === null) return obj;const newObj = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {newObj[key] = obj[key]; // 仅复制第一层}}return newObj;
}
2. 内置方法
  • Object.assign()

    const obj = { a: 1, b: { c: 2 } };
    const copy = Object.assign({}, obj);
    
  • 展开运算符 ...

    const arr = [1, { x: 2 }];
    const arrCopy = [...arr];
    
3. 特性验证
const original = { a: 1, b: { c: 2 } };
const copy = shallowCopy(original);copy.b.c = 999; // 修改嵌套对象
console.log(original.b.c); // 999 → 数据被污染

三、深拷贝实现方案

1. JSON 序列化法
const deepCopyJSON = obj => JSON.parse(JSON.stringify(obj));

局限性

  • 无法处理 undefinedSymbol、函数
  • 忽略原型链
  • 不能解决循环引用
  • 会破坏特殊对象(如 Date 变为字符串)
2. 递归实现(基础版)
function deepClone(source) {if (source === null || typeof source !== 'object') return source;const target = Array.isArray(source) ? [] : {};for (let key in source) {if (source.hasOwnProperty(key)) {target[key] = deepClone(source[key]); // 递归复制}}return target;
}
3. 增强版深拷贝

处理复杂场景:

function enhancedDeepClone(source, map = new WeakMap()) {// 处理循环引用if (map.has(source)) return map.get(source);// 处理特殊对象if (source instanceof Date) return new Date(source);if (source instanceof RegExp) return new RegExp(source);const target = Array.isArray(source) ? [] : {};map.set(source, target);// 处理Symbol作为keyconst symKeys = Object.getOwnPropertySymbols(source);symKeys.forEach(symKey => {target[symKey] = enhancedDeepClone(source[symKey], map);});for (let key in source) {if (source.hasOwnProperty(key)) {target[key] = enhancedDeepClone(source[key], map);}}return target;
}
4. 第三方库
  • lodash 的 _.cloneDeep()
    import _ from 'lodash';
    const perfectCopy = _.cloneDeep(original);
    

四、性能与选择策略

方法优点缺点适用场景
浅拷贝速度快、内存占用少嵌套数据不安全简单对象结构
JSON法简单快捷丢失特殊类型无特殊类型的数据
递归深拷贝完全控制性能消耗大复杂对象结构
第三方库功能完善增加依赖生产环境推荐

五、应用场景示例

  1. 状态管理
    Redux 的 reducer 中必须使用深拷贝保证状态不可变性:

    function reducer(state, action) {return {...state,user: _.cloneDeep(action.payload) // 确保状态独立};
    }
    
  2. 数据快照
    保存历史记录时需完全独立的数据副本:

    const gameState = { players: [{ score: 0 }], level: 1 };
    const history = [deepClone(gameState)];
    
  3. 配置对象复用
    修改配置模板不影响原始模板:

    const defaultConfig = { theme: 'dark', permissions: { read: true } };
    const userConfig = deepClone(defaultConfig);
    userConfig.permissions.write = false;
    

六、常见误区

  1. 误以为 Object.assign() 是深拷贝
    实际上它只能实现第一层深拷贝,嵌套对象仍是浅拷贝。

  2. 忽略循环引用问题

    const obj = { a: 1 };
    obj.self = obj;
    deepClone(obj); // 基础实现会栈溢出
    
  3. 处理特殊对象不当
    直接克隆 Date 对象会丢失方法:

    const date = new Date();
    const badCopy = JSON.parse(JSON.stringify(date)); // 变成字符串
    

掌握深浅拷贝的底层原理和实现方式,能帮助开发者根据实际需求选择最优解决方案,在保证数据安全性的同时平衡性能消耗。对于日常开发,推荐优先使用成熟的工具库(如 lodash),但在需要精细控制时,理解手写实现原理至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RISC-V架构的平台级中断控制器(PLIC:platform-level interrupt controller)详解

英文缩写 英文缩写中文含义PLICplatform-level interrupt controller,平台级中断控制器SMTsimultaneous multi-threading,并发多线程HARTRISC-V架构中的硬件线程SMTsimultaneous multi-threading,多线程执行M-MODEmachine mode,机…

[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化

关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01:PHP 序列化 — Serialize 序列化就是将对象的状态信息转化为可以存储或传输的形式的过程,在 PHP 中,通常使用 serialize() 函数来完成序列化的操作…

航空装配自动化神器Ethercat转profient网关搭配机器人精准控制

生产管理系统通过网关与装配机器人连接,加快航空器机身的装配速度,减少人为误差。 航空制造对装配线的精度和效率有着极高的要求。某航空制造厂使用的耐达讯Profinet转EtherCAT协议网关NY-PN-ECATM,将其生产管理系统与装配机器人连接&#xf…

什么是MySql的主从复制(主从同步)?

主页还有其他面试题总结,有需要的可以去看一下,喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理? 主从复制的核心就是二进制binlog(DDL(数据定义语言)语句和DML(数据操纵语言&#xff09…

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门:三步调用大模型接口,OpenAI SDK无缝兼容实战用例文…

【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch

ping:检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat:查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…

【数据结构】(11) Map 和 Set

一、Map 和 Set 的简介 1、Set 和 Map Map 和 Set 是集合类框架学习的最后一部分。Map 和 Set 都是接口,需要通过 TreeSet、HashSet 和 TreeMap、HashMap 实例化。注意,Set 实现了 Collection,Map 并没有。 Set 存放的是键(Key&a…

【HTML— 快速入门】HTML 基础

准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器,我们在写前端代码时,使用 Sublime Text 打开比使用记事本打开,得到的代码体验更好,比 vscode…

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)

鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar) 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…

鸿蒙next 点击穿透实现

点击穿透可以参考华为开发的保留文章,该章节只能在developer preview版本下查看 点击穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…

27.[前端开发-JavaScript基础]Day04-函数基本使用-递归-变量作用域-函数式编程

一、JavaScript函数 1 认识JavaScript函数 程序中的foo、bar、baz 认识函数 函数使用的步骤 2 函数的声明和调用 声明和调用函数 函数的参数 有参数的函数练习 函数的返回值 函数的练习 arguments参数(JS高级再学习) 3 函数的递归调用 函数中调用函数…

添加成对约束后的标签传播算法研究:使用Python语言编写算法,在空手道数据集下验证算法的准确性,在一定程度上解决非对齐问题

背景: 辅导的过程中遇到了一个比较新颖的问题,下面是我对这个问题的分析和简要思路介绍。 思路分析: 这算机器学习下面的无监督学习,标签传播算法简称LPA,传统的标签传播算法会出现非对齐问题,一句话描述就…

鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计

本博文很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言,未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本。请看下图: 因此, 读者如果看到类似《鸿蒙应用程序开发》(2021年版本 清华大学出版计)书 还使用Java语言…

P9420 [蓝桥杯 2023 国 B] 双子数--最高效的质数筛【埃拉托斯特尼筛法】

P9420 [蓝桥杯 2023 国 B] 双子数 题目 分析代码 题目 分析 首先&#xff0c;我们如何找到双子数&#xff1f; 1&#xff09;找到所有质数满足范围内的质数&#xff08;即至少质数^2<23333333333333) 我们看见双子数x的范围2333<x<23333333333333&#xff0c;又因为…

deepseek 导出导入模型(docker)

前言 实现导出导入deepseek 模型。deepseek 安装docker下参考 docker 导出模型 实际生产环境建议使用docker-compose.yml进行布局&#xff0c;然后持久化ollama模型数据到本地参考 echo "start ollama" docker start ollama#压缩容器内文件夹&#xff0c;然后拷贝…

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭

前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…

[RH342]tcpdump

[RH342]tcpdump 1. 题目2. 解题 1. 题目 服务器serverc 和 servera 之间有进程定期发送一个明文密码,找出它2. 解题 找出通信端口 抓包分析 tcpdump -X -vv port 6644红框中就是密码,所以密码是root123

连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接

文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上&#xff0c;需要使用SQL Server&#xff0c;然后使用jdbc连接sql server突然报错为&#xff1a;SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…

Buildroot 添加自定义模块-内置文件到文件系统

目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统&#xff0c;适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…

物联网通信应用案例之《智慧农业》

案例概述 在智慧农业方面&#xff0c;一般的应用场景为可以自动检测温度湿度等一系列环境情况并且可以自动做出相应的处理措施如简单的浇水和温度控制等&#xff0c;且数据情况可远程查看&#xff0c;以及用户可以实现远程控制。 基本实现原理 传感器通过串口将数据传递到Wi…