首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 怎么复制对象

在JavaScript中,复制对象可以通过多种方式实现,具体取决于你是否需要深拷贝(deep copy)或浅拷贝(shallow copy)。

浅拷贝(Shallow Copy)

浅拷贝只复制对象的顶层属性,如果对象的属性是引用类型(如数组或对象),则复制的是引用,而不是实际的对象。这意味着原对象和复制后的对象的引用类型属性会指向同一个内存地址。

常见的浅拷贝方法有:

  1. Object.assign()
代码语言:txt
复制
const originalObject = { a: 1, b: { c: 2 } };
const copiedObject = Object.assign({}, originalObject);

console.log(copiedObject); // { a: 1, b: { c: 2 } }

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

console.log(copiedObject.b.c); // 3,因为b属性引用的是同一个对象
  1. 数组的扩展运算符(...)
代码语言:txt
复制
const originalArray = [1, 2, { a: 3 }];
const copiedArray = [...originalArray];

console.log(copiedArray); // [1, 2, { a: 3 }]

// 修改原数组的引用类型元素
originalArray[2].a = 4;

console.log(copiedArray[2].a); // 4,因为数组中的对象引用的是同一个对象

深拷贝(Deep Copy)

深拷贝会复制对象的所有属性以及属性的属性(如果属性也是对象),这样原对象和复制后的对象就不会有任何引用关系。

常见的深拷贝方法有:

  1. JSON.parse() 和 JSON.stringify()
代码语言:txt
复制
const originalObject = { a: 1, b: { c: 2 } };
const copiedObject = JSON.parse(JSON.stringify(originalObject));

console.log(copiedObject); // { a: 1, b: { c: 2 } }

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

console.log(copiedObject.b.c); // 2,因为b属性被深拷贝了,与原对象无关

注意:这种方法不能复制函数、RegExp对象、Date对象、undefined、Infinity、-Infinity、NaN和字符串中的函数等。

  1. 使用第三方库

例如,使用lodash库的_.cloneDeep()方法可以方便地进行深拷贝。

代码语言:txt
复制
const _ = require('lodash');
const originalObject = { a: 1, b: { c: 2 } };
const copiedObject = _.cloneDeep(originalObject);

console.log(copiedObject); // { a: 1, b: { c: 2 } }

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

console.log(copiedObject.b.c); // 2,因为b属性被深拷贝了,与原对象无关

选择使用哪种复制方式取决于你的具体需求。如果你只需要复制对象的顶层属性,可以使用浅拷贝;如果你需要完全独立的对象副本,应该使用深拷贝。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 面向对象之深复制与浅复制

    前言: 基于面向对象的思想,大部分的类都可视为“工具”。那么对于工具的使用,我们总是期望能高效而又方便。特别是当我们在重复实现某些功能的时候,那有没有一种能快速复用类的捷径呢?   ...“Copy”----复制。   查看Java中的Object这个祖先类我们可以发现,该类含有一个clone()方法,并且返回“Object”类型。...其实,这就是所谓的“浅复制(shadow copy)”。其大概意思指的是对实现了Cloneable接口的对象进行克隆的时候,值对象可直接复制,而引用对象只是复制其“引用”而已。...具体,可参考下图: 图一:浅复制 思考一下,如何实现“深复制”?即在复制基本类型的同时,还能复制引用类型做指向的对象。 解决方法是这样的,首先得确定引用对象实现了Cloneable接口。...然后,我们重写House类的clone()方法对引用对象同样进行克隆操作。最后将其set回house对象,这样便实现了深复制!

    60610

    JS深浅复制

    ❝焦虑很多时候就是因为想的太多 ❞ 简明扼要 JS在语言层面「仅支持浅复制」,深复制需要手动实现 instanceof 判断的是 a和A是否有「血缘关系」 扩展运算符在副本中「直接定义新的属性」 Object.assign...浅复制 VS 深复制 针对JS引用类型数据(复杂数据)的复制,有两种处理模式。...❝JS在语言层面「仅支持浅复制」,深复制需要手动实现 ❞ ---- 2. 浅谈浅复制 在JS中,存在几个内置属性天然支持数据浅复制,但是每个属性都有一定的适用条件和范围。...扩展运算符不能复制内置对象的特殊属性 我们在前面介绍JS数据类型的时候,介绍了在浏览器宿主环境下,JS = ECMAScript + DOM + BOM。...深复制 JS中深复制需要手动实现、 3.1 通过嵌套扩展运算符实现深复制 const original = {name: '789', work: {address: 'BeiJing'}}; const

    4.1K20

    Java对象复制的方法

    该语句的作用是将stu1的引用赋值给stu2, 这样,stu1和stu2指向内存堆中同一个对象。如图: 那么,怎么能干干净净清清楚楚地复制一个对象呢。...BeanUtils和PropertyUtils进行对象复制; (4)通过序列化实现对象的复制。...,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。...原因是浅复制只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。 为了达到真正的复制对象,而不是纯粹引用复制。...,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。

    1.4K40

    python python 对象复制 deepcopy

    你想复制一个对象.因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的....注意: 要想成为一个Python高手,首先要注意的问题就是对象的变更操作和赋值,它们都是针对对象的引用操作的.一个语句比如a = []将a重新绑定给一个新对象,但不会影响以前的对象.然而,对象复制却不同...,当对象复制后,对象变更操作就有了区别....如果你想修改一个对象,而且想让原始的对象不受影响,那你就需要对象复制.正如本节说的一样,你可以使用copy模块中的两个方法来实现需求.一般的,可以使用copy.copy,它可以进行对象的浅复制(shallow...copy),它复制了对象,但对于对象中的元素,依然使用引用.

    2.1K20

    java对象复制和属性值复制工具类

    两个不同类型的对象中有字段名称不区分大小写的情况下一样,字段含义一样,需要组装到另一个对象中去,然后就写了一个这种工具类 我的类型比较特殊,老系统和新系统的对象命名大小写命名不一致,并且字段相同类型也有不一致的情况...温馨提示: 如果同一种类型的对象 属性字段名equals相等 并且类型一致。...(CopyBeanUtil.class); /** * 复制sour里属性不为空的值到obje为空的属性 * * @param obje 目标实体类 * @param sour 源实体类 *...else { Object setProperty = setProperty(obje, propertyName, propertyValue); } } return obje; } /** * 复制... alist = new ArrayList(); for (E o : list) { alist.add((T) o); } return alist; } /** * 属性copy 复制

    1.4K30

    MySQL 复制延迟怎么处理

    ‍我们在工作过程中,可能多多少少会遇到主从延迟的情况,这一节内容我们就来聊聊什么情况可能出现主从延迟,怎样判断延迟,存在延迟怎么处理。...如果是单线程复制,这期间从库其他事务需要等待。所以可能产生比较久的延迟。...主从延迟怎么处理呢? 方法一 在前面我们聊到了,很多主从延迟的原因,都因为从库是单线程,所以可以考虑开启并行复制。...并行复制具体介绍和开启方式,可以参考笔者 7 月份出版的新书《MySQL DBA 精英实战课》9.5 节:MySQL并行复制。点击文末阅读原文可跳转京东购买链接,目前可参与满 100 减 50 活动。...然后在原来的从库忽略这张表的复制,业务查询原来的从库就基本没延迟了。

    1.6K30
    领券