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

JS手写代码篇---手写浅拷贝

16、浅拷贝

如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值(直接赋值),如果是引用数据类型,拷贝的就是内存地址。如果其中一个对象的引用内存地址发生改变,另一个对象也会发生变化。(动态的)

看看各种浅拷贝:

  • es6的浅拷贝 :assign

    const obj1 = { a: 1, b: 2 };const obj2 = { c: 3, d: 4 };const shallowCopy1 = Object.assign({}, obj1, obj2);console.log('es6浅拷贝:', shallowCopy1); // { a: 1, b: 2, c: 3, d: 4 }
    
  • 扩展运算符

     const shallowCopy2 = { ...obj1, ...obj2 };console.log('扩展运算符浅拷贝:', shallowCopy2); // { a: 3, b: 4 }
    
  • 数组中的方法:slice

            const arr = [1, 2, 3, 4];const shallowCopy3 = arr.slice();console.log('数组slice浅拷贝:', shallowCopy3); // [1, 2, 3, 4]
    
  • concat:合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

      const arr2 = [5, 6, 7];const shallowCopy4 = arr.concat(arr2);console.log('数组concat浅拷贝:', shallowCopy4); // [1, 2, 3, 4, 5, 6, 7]
    

浅拷贝的核心逻辑是:

  1. 判断输入是否为对象
    • 如果不是对象(如 numberstring),直接返回原值(因为基本类型不需要拷贝)。
    • 如果是对象或数组,则创建一个新对象/数组。
  2. 遍历属性并复制
    • 使用 for...in 遍历对象的所有可枚举属性。
    • hasOwnProperty 过滤掉原型链上的属性,只拷贝自身属性。
    • 将属性值直接赋给新对象(如果是对象,则保持引用)。

代码:

    function shallowCopy(obj) {// 判断obj是否为对象,只拷贝对象if (!obj || typeof obj !== 'object') {return obj;}// 判断obj的类型const newObj = Array.isArray(obj) ? [] : {};// 进行遍历,是obj的属性我们才进行拷贝// 仅对对象和数组及逆行拷贝for (let key in obj) {if (obj.hasOwnProperty(key)) {newObj[key] = obj[key];}}// 返回 newObj;return newObj;}

浅拷贝的局限性:

浅拷贝只能处理一层的拷贝:

  • 如果对象的属性是嵌套对象,浅拷贝只会复制引用,而不是新对象。
http://www.xdnf.cn/news/13234.html

相关文章:

  • 376. Wiggle Subsequence
  • Golang dig框架与GraphQL的完美结合
  • IK分词器
  • K8S认证|CKS题库+答案| 11. AppArmor
  • 用纯.NET开发并制作一个智能桌面机器人(五):使用.NET为树莓派开发Wifi配网功能
  • 【Docke基础】Docker简介与快速入门:从概念到核心优势
  • Ynoi数据结构题单练习1
  • 解决启动SpringBoot是报错Command line is too long的问题
  • shell脚本--常见案例
  • 树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
  • 安装HomeBrew
  • 软考 系统架构设计师系列知识点之杂项集萃(86)
  • win11 mysql解压版本安装及配置
  • 【强化学习】TD-MPC论文解读
  • STM32标准库-DMA直接存储器存取
  • 服务器数据恢复—ocfs2文件系统被误格式化为Ext4文件系统的数据恢复案例
  • OS12.【Linux】gcc和g++以及动静态链接
  • RNN做中文分词
  • Linux动态库与静态库详解:从入门到精通
  • Redis高可用与扩展性:构建稳定高效的缓存系统
  • AR珠宝佩戴与传统的珠宝购物有哪些区别?​
  • 3.3.1_1 检错编码(奇偶校验码)
  • eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
  • 破界协同:解锁电商平台混合云架构的双引擎效能
  • 深入浅出掌握 Axios(持续更新)
  • day50python打卡
  • 论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(四)
  • Flutter:弹窗UI,不带背景色,自定义图片的弹窗
  • Linux向文件每行结尾追加指定内容的方法
  • PyArk飘云阁出品的ARK工具