首页 > 编程语言 >JavaScript 中的浅拷贝和深拷贝

JavaScript 中的浅拷贝和深拷贝

时间:2024-07-31 10:58:45浏览次数:15  
标签:obj1 obj2 JavaScript JSON let 拷贝 属性

目录

浅拷贝

定义

特点

示例

使用场景

实现方法

深拷贝

定义

特点

示例

使用场景

实现方法


浅拷贝

定义

浅拷贝是指仅复制对象的第一层属性。如果对象的属性是基本类型(如字符串、数字、布尔值),则会复制这些值;如果属性是引用类型(如对象、数组),则只会复制指向这些对象的引用,而不是对象本身。

特点

  • 只复制对象的第一层属性。
  • 引用类型属性的拷贝实际上是引用的拷贝,而不是值的拷贝。

示例

let obj1 = {
  a: 1,
  b: { c: 2 }
};

let obj2 = Object.assign({}, obj1); // 浅拷贝

// 修改原始对象的引用类型属性
obj1.b.c = 3;

console.log(obj1); // 输出: { a: 1, b: { c: 3 } }
console.log(obj2); // 输出: { a: 1, b: { c: 3 } } (b属性的c值也被改变了)

使用场景

  • 当你只需要复制对象的第一层属性时。
  • 当你不需要关心对象内部的变化时。 

实现方法

  • 使用 Object.assign
let obj2 = Object.assign({}, obj1);
  • 使用扩展运算符 (...)
let obj2 = { ...obj1 };

深拷贝

定义

深拷贝是指不仅复制对象的第一层属性,还会递归地复制所有层级的属性。对于引用类型,会创建新的对象并将原对象内的属性也复制过去。

特点

  • 递归复制所有层级的属性。
  • 引用类型属性会被复制为新的对象实例。

示例

let obj1 = {
  a: 1,
  b: { c: 2 }
};

// 使用 JSON.parse 和 JSON.stringify 实现深拷贝
let obj2 = JSON.parse(JSON.stringify(obj1));

// 修改原始对象的引用类型属性
obj1.b.c = 3;

console.log(obj1); // 输出: { a: 1, b: { c: 3 } }
console.log(obj2); // 输出: { a: 1, b: { c: 2 } } (b属性的c值没有被改变)

使用场景

  •  当你需要复制整个对象及其所有内部属性时。
  • 当你需要确保对象内部的变化不会影响到副本时。

实现方法

  • 使用 JSON.parse 和 JSON.stringify:适用于大多数情况下的深拷贝,但有一些限制,比如无法处理循环引用和函数属性。
let obj2 = JSON.parse(JSON.stringify(obj1));
  • 使用第三方库:例如 lodash 提供了 _.cloneDeep 方法来实现深拷贝。
let _ = require('lodash');
let obj2 = _.cloneDeep(obj1);

注意:使用 JSON.parse 和 JSON.stringify 进行深拷贝有一些限制,比如无法处理循环引用和函数属性。 

标签:obj1,obj2,JavaScript,JSON,let,拷贝,属性
From: https://blog.csdn.net/m0_63306944/article/details/140816655

相关文章

  • JavaScript
    JS简介JS特点Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,遗留的速度问题,为客户提供更流畅的浏览效果。JS是一种运行于浏览器端上的小脚本语句,可以实现网页如文本......
  • JavaScript 对象
    1.JavaScript对象把一个单一值(porsche)赋给名为car的变量varcar="porsche";对象也是变量。但是对象包含很多值。这段代码把多个值(porsche,911,white)赋给名为car的变量varcar={type:"porsche",model:"911",color:"white"};值以名称:值对的方式来书写(名称和......
  • JavaScript 数据结构与基础算法
    数据结构全解参考:数据结构|博客园-SRIGT相关代码仓库查看:data-struct-js|Github-SR1GT0x00前置知识(1)类使用关键字class声明一个类classPerson{}JavaScript的类中通过constructor使用构建函数classPerson{constructor(name){this.name......
  • JavaScript の 闭包
    闭包概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域(什么鸟语)简单理解就是:闭包=内层函数+外层函数的变量如functionouter(){leta=0functioninner(){a++console.log(a)}returninner}//这......
  • html中javascript点击事件后显示或隐藏某些元素时需要点击两次才生效的原因分析和优化
    html中javascript点击事件后显示或隐藏某些元素时需要点击两次才生效的原因分析和优化。原来的代码如下:<divclass="cardcardcol-sm-6col-md-4col-xl-2col-lg-2justify-content-centerbg-secondary-subtle"id="tools-trigger"><ahref="javascript:vo......
  • 自学JavaScript(放假在家自学第一天)
    目录 JavaScript介绍分为以下几点1.1JavaScript是什么1.2JavaScript书写位置1.3Javascript注释1.4Javascript结束符1.5Javascript输入输出语法JavaScript(是什么?)是一种运行在客户端(浏览器)的编程语言,实现人机交互效果。2.作用(做什么?)网页特效(监听用户的......
  • 引用拷贝和浅拷贝和深拷贝
    引用拷贝定义:引用拷贝只复制对象的地址值,不会创建新的对象,改变拷贝对象的属性,原对象属性也会发生变化实现方式通常是"="直接赋值,浅拷贝:定义浅拷贝会创建新的对象接收,所以改变拷贝对象的属性时不会影响源对象,但是浅拷贝不会创建内部嵌套对象,而是引用嵌套对象地址,所以......
  • JavaScript入门速称
    菜鸟教程:JavaScript教程|菜鸟教程(runoob.com) 对象操作1.对象增删改查1.1创建对象letobj={}1.2新增属性obj.a=11.3修改属性obj.a='a'1.4查询属性obj.a|1.5删除属性deleteobj.a2.其他操作2.1obj[a]=12.2Object.assign()2.3let{name......
  • Python学习手册(第四版)】学习笔记09.3-Python对象类型-分类、引用VS拷贝VS深拷贝、比较
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。这部分稍杂,视需要选择目录读取。主要讲的是对之前的所有对象类型作复习,以通俗易懂、由浅入深的方式进行介绍,所有对象类型共有的特性(例如,共享引用),引用、拷贝、深拷贝,以及比较、......
  • 将 int[] arr1 ={10,20,30}; 拷贝到 arr2数组,要求数据空间是独立的。
    1publicclassshuzu06{2//编写一个main方法3publicstaticvoidmain(String[]args){45//将int[]arr1={10,20,30};拷贝到arr2数组,6//要求数据空间是独立的。78int[]arr1={10,20,30};910//创建一......