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

js-对象浅拷贝和深拷贝( B复制A,看B的值对比:都变为浅,一变一不变为深)

1.前言

js的数据类型分为

  • 基本数据类型numberstringbooleannullundefinedsymbol
  • 引用类型objectarrayfunction

对象的拷贝分为浅拷贝与深拷贝。在对于对象或数组处理时不同的应用场景。

2.对象浅拷贝

        基本数据类型的赋值是直接复制值本身,而不是引用,所以修改一个变量的值不会影响到另外一个变量的值。

let a = 10;
let b = a;  // 浅拷贝,b得到的是a的值
b = 20;     // 修改b的值
console.log(a); // 输出 10,a的值没有被改变
console.log(b); // 输出 20

基本数据类型,b是a的浅拷贝,修改b不会影响a。

3.对象深拷贝

        引用类型直接赋值是复制的引用(内存地址),而不是值的本身。所以当修改复制后对象的属性会影响到另外一个对向的属性。

let obj1 = { name: 'Alice' };
let obj2 = obj1;  // 浅拷贝,obj2得到的是obj1的引用
obj2.name = 'Bob'; // 修改obj2的属性
console.log(obj1.name); // 输出 'Bob',obj1的属性被改变
console.log(obj2.name); // 输出 'Bob'

引用对象类型,直接赋值是浅拷贝复制的引用,修改obj2的属性会影响obj1。

完全独立的复制一个对象或数组时,需要使用对象深拷贝。

function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

let obj1 = { name: 'Alice', details: { age: 25 } };
let obj2 = deepClone(obj1);  // 深拷贝
obj2.details.age = 30;       // 修改obj2的属性
console.log(obj1.details.age); // 输出 25,obj1的属性没有被改变
console.log(obj2.details.age); // 输出 30

引用对象类型深拷贝,修改obj2的属性不会影响obj1。。 

const cloneArr = arr => {
    const result = [];
    if (isNull(arr)) {
        return result;
    }
    for (let index = 0, len = arr.length; index < len; index++) {
        result[index] = cloneObject(arr[index]);
    }
    return result;
}

4.总结

  • 基本数据类型的赋值是浅拷贝,复制的是值本身

  • 引用类型的赋值是浅拷贝,复制的是引用(内存地址)

  • 深拷贝用于完全独立地复制对象或数组,修改新对象不会影响原对象。

 B复制A,看B的值对比:都变为浅,一变一不变为深

http://www.dtcms.com/a/62643.html

相关文章:

  • 5G技术与物联网融合:未来智慧城市的基石
  • Docker+Flask 实战:打造高并发微服务架构
  • ListView_GetIconBufferX函数和ListView_GetIconBufferY函数和RECT结构的关系
  • 【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
  • Windows安装milvus和图形化管理工具attu
  • 【webrtc debug tools】 rtc_event_log_to_text
  • 大数据面试之路 (一) 数据倾斜
  • 第一章:介绍Python编程-1.Python是什么
  • 2.2 企业级ESLint/Prettier规则定制
  • Excel两列和依次相减
  • AnyAnomaly: 基于大型视觉语言模型的零样本可定制视频异常检测
  • 中断机制及NVIC管理解析
  • Xavier 初始化:深度网络权重初始化的经典之作
  • Java小白-管理项目工具Maven(2)初识Maven
  • Cursor配置Golang开发环境
  • Java变量与常量
  • ubuntu 22.04 本地部署DeepSeek的Janus Pro
  • BigFoot EventAlertMod lua
  • 【hot100】046全排列
  • 初识数组下篇
  • 滑动窗口及边缘化直观理解
  • Maven 的常用指令
  • 编程视界:C++命名空间
  • 人工智能之数学基础:坐标变换
  • 【JavaEE】SpringIoC与SpringDI
  • 详细学习 pandas 和 xlrd:从零开始
  • 软件设计模式之简单工厂模式
  • PHP将HTML标签转化为图片
  • 理解字符流和字节流,节点流和处理流、缓冲流、InputStreamReader、BufferInputStream、BufferReader...
  • 深入解析 C 语言中含数组和指针的构造体与共同体内存计算