对象 赋值后原数据随赋值的改变而改变 -- 浅拷贝 深拷贝

 1. 当第一层的属性值不是基本数据类型时,可使用深拷贝

(1)JSON.parse(JSON.stringify(data))

let user = { name: '李四', skill: { css: 90 } };
let user1 = JSON.parse(JSON.stringify(user));
user1.name = "张三";
user1.skill.css = 60;
console.log(user, user1)

 

2. 当第一层的属性值是基本数据类型时,可使用浅拷贝

(1)Object.assign(target, ...sources)    第一个参数是拷贝的目标target,剩下的参数是拷贝的源对象sources(可以是多个)

let user = { name: '李四', skill: { css: 90 } };
let user1 = {};
Object.assign(user1, user);
user1.name = "张三";
user1.skill.css = 60;
console.log(user, user1);

(2)拓展运算符(...)

let user = { name: '李四', skill: { css: 90 } };
let user1 = { ...user };
user1.name = "张三";
user1.skill.css = 60;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中对象的复制可以分为直接赋值浅拷贝深拷贝三种方式。 1. 直接赋值:直接将一个对象赋值给另一个对象,两个对象指向同一个内存地址,修改其中一个对象会影响另一个对象。 示例代码: ```java SomeClass obj1 = new SomeClass(); SomeClass obj2 = obj1; // 直接赋值 ``` 2. 浅拷贝(Shallow Copy):创建一个新的对象,然后将对象的非静态字段值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制引用,两个对象将共享同一份数据修改其中一个对象的引用类型字段会影响另一个对象。 示例代码: ```java class SomeClass implements Cloneable { private int value; private List<String> list; public SomeClass() { list = new ArrayList<>(); } @Override protected SomeClass clone() throws CloneNotSupportedException { return (SomeClass) super.clone(); } } SomeClass obj1 = new SomeClass(); obj1.setValue(10); obj1.getList().add("item1"); SomeClass obj2 = obj1.clone(); // 浅拷贝 System.out.println(obj2.getValue()); // 输出 10 System.out.println(obj2.getList()); // 输出 [item1] obj2.setValue(20); obj2.getList().add("item2"); System.out.println(obj1.getValue()); // 输出 10 System.out.println(obj1.getList()); // 输出 [item1, item2] ``` 3. 深拷贝(Deep Copy):创建一个新的对象,然后将对象的所有字段值复制到新对象中,包括引用类型的字段。这样两个对象完全独立,修改其中一个对象不会影响另一个对象。 示例代码: ```java class SomeClass implements Cloneable { private int value; private List<String> list; public SomeClass() { list = new ArrayList<>(); } @Override protected SomeClass clone() throws CloneNotSupportedException { SomeClass cloned = (SomeClass) super.clone(); cloned.list = new ArrayList<>(list); // 创建新的 ArrayList 对象,复制对象数据 return cloned; } } SomeClass obj1 = new SomeClass(); obj1.setValue(10); obj1.getList().add("item1"); SomeClass obj2 = obj1.clone(); // 深拷贝 System.out.println(obj2.getValue()); // 输出 10 System.out.println(obj2.getList()); // 输出 [item1] obj2.setValue(20); obj2.getList().add("item2"); System.out.println(obj1.getValue()); // 输出 10 System.out.println(obj1.getList()); // 输出 [item1] ``` 需要注意的是,如果要实现深拷贝,引用类型的字段也需要实现 Cloneable 接口并重写 clone() 方法。另外,还可以使用序列化和反序列化实现深拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值