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

通过案列理解js中的深拷贝和浅拷贝

浅拷贝:浅拷贝会创建一个新对象或数组,新对象或数组会复制原始对象或数组的一层属性。对于基本数据类型的属性,会直接复制其值;而对于引用数据类型的属性,只会复制其引用,即新对象和原始对象中的引用数据类型属性会指向同一个内存地址。

…扩展运算符是浅拷贝

// 浅拷贝示例
const originalObj = {name: 'John',age: 30,hobbies: ['周杰伦', '邓紫棋']
};// 使用扩展运算符进行浅拷贝
const shallowCopy = {...originalObj };// 修改浅拷贝对象的基本数据类型属性
shallowCopy.name = 'Jane';
// 修改浅拷贝对象的引用数据类型属性
shallowCopy.hobbies.push('赵四');console.log(originalObj.name); // 输出: John //基本数据类型的属性,会直接复制源对象的值
console.log(originalObj.hobbies); // 输出: ['周杰伦', '邓紫棋', '赵四'] // 复制其引用

object.assign也是浅拷贝
Object.assign()方法接收的第一个参数作为目标对象,后面的所有参数作为源对象

let outObj = {inObj: {a: 1, b: 2}
}
let newObj = Object.assign({}, outObj)
newObj.inObj.a = 2
console.log(outObj) // {inObj: {a: 2, b: 2}}

数组方法的浅拷贝 map(), filter() , reduce()
map()浅拷贝

const original = [1, { name: 'Alice' }, [3, 4]];// 使用 map 创建新数组
const copyMap = original.map(item => item);console.log(copyMap);       // [1, { name: 'Alice' }, [3, 4]]
console.log(copyMap === original);          // false (新数组)
console.log(copyMap[1] === original[1]);    // true (对象引用相同)// 修改原数组中的对象
original[1].name = 'Bob';
console.log(copyMap[1].name);  // 'Bob' (同步修改)

filter() 浅拷贝

const original = [1, { name: 'Alice' }, [3, 4]];// 使用 filter 创建新数组(保留所有元素)
const copyFilter = original.filter(() => true);console.log(copyFilter);      // [1, { name: 'Alice' }, [3, 4]]
console.log(copyFilter === original);         // false (新数组)
console.log(copyFilter[2] === original[2]);   // true (数组引用相同)
// 修改原数组中的嵌套数组
original[2].push(5);
console.log(copyFilter[2]);   // [3, 4, 5] (同步修改)

reduce()浅拷贝

const original = [1, { name: 'Alice' }, [3, 4]];// 使用 reduce 构建新数组
const copyReduce = original.reduce((acc, item) => {acc.push(item);return acc;
}, []);console.log(copyReduce);      // [1, { name: 'Alice' }, [3, 4]]
console.log(copyReduce === original);         // false (新数组)
console.log(copyReduce[0] === original[0]);   // true (值相同)
console.log(copyReduce[1] === original[1]);   // true (对象引用相同)// 添加新元素到原始数组
original.push(5);
console.log(original.length);  // 4
console.log(copyReduce.length); // 3 (不共享长度变化)

深拷贝:深拷贝就是完完全全拷贝一份新的对象,它会在内存的堆区域重新开辟空间,修改拷贝对象就不会影响到源对象
数组深拷贝方法:concat(), slice() ,Array.from()

  //数组//1.concat()(这里实现了深拷贝)const n =['你好','周杰伦']//  concat方法创建并返回一个新的数组,新数组包含调用concat方法放入数组的元素const j = [].concat(n) j.push('你好','邓紫棋')console.log('n=',n) // n= (2) ["你好", "周杰伦"]console.log('j=',j) //j= (4) ["你好", "周杰伦", "你好", "邓紫棋"]//2.slice() 方法(这里实现了深拷贝)const k =['你好','周杰伦']const i = k.slice() k.push('你好','邓紫棋')console.log('k=',k) //k= Array(4)[0: "你好" 1: "周杰伦" 2: "你好" 3: "邓紫棋"]console.log('i=',i)//i= Array(2)[0: "你好" 1: "周杰伦"]//3. Array.from() 方法(这里实现了深拷贝)const n =['你好','周杰伦']const j = Array.from(n)  j.push('你好','邓紫棋')console.log('n=',n) // n= Array(2)[0: "你好" 1: "周杰伦"]console.log('j=',j) // j= Array(4)[0: "你好" 1: "周杰伦" 2: "你好" 3: "邓紫棋"]
http://www.lqws.cn/news/579907.html

相关文章:

  • Server-Sent Events (SSE) 技术详解
  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • Windows 开发环境部署指南:WSL、Docker Desktop、Podman Desktop 部署顺序与存储路径迁移指南
  • PreparedStatement详解
  • Vue3静态文档资源展示的实现和使用总结
  • 【CS创世SD NAND征文】SD NAND赋能新一代儿童智能玩具
  • js代码04
  • 生信分析之流式数据分析:Flowjo 软件核心功能全解析
  • 《微信生态裂变增长利器:推客小程序架构设计与商业落地》
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • python | numpy小记(四):理解 NumPy 中的 `np.round`:银行家舍入策略
  • BUUCTF在线评测-练习场-WebCTF习题[MRCTF2020]你传你[特殊字符]呢1-flag获取、解析
  • 攻防世界-MISC-red_green
  • 障碍感知 | 基于3D激光雷达的三维膨胀栅格地图构建(附ROS C++仿真)
  • macos 使用 vllm 启动模型
  • 【数据分析】环境数据降维与聚类分析教程:从PCA到可视化
  • OpenCV CUDA模块设备层----计算向量的平方根函数sqrt
  • 【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图
  • 极海G32R501双向数字电源解决方案 赋能AI服务器及电源应用创新
  • Android中Compose常用组件以及布局使用方法
  • 深入解析TCP:可靠传输的核心机制与实现逻辑
  • 首次使用“非英伟达”芯片!OpenAI租用谷歌TPU,降低推理计算成本
  • 成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用
  • (LeetCode 每日一题) 594. 最长和谐子序列 (哈希表)
  • redis相关内容以及安全知识
  • 开疆智能CCLinkIE转Canopen网关连接UV紫外灯配置案例
  • python包管理工具uv VS pip
  • iOS 接口频繁请求导致流量激增?抓包分析定位与修复全流程
  • 人工智能和云计算对金融未来的影响
  • 力扣 hot100 Day30