js 对象复制 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

我最近在做一个vue + element-UI + vue-resource + vuex项目的时候,遇到了一个对象的问题。

当我们在项目需要 复制一个对象到另一个对象并且  被复制的对象不能受复制后的对象的影响。

我先总结下 我们哪些方法可以复制对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 直接赋值
 
var  obj1 = { a: 1 };
var  obj2 = obj1;
 
console.log(obj2);  // { a: 1 }
 
// 通过 Object.assign() 这个属性来进行复制
 
var  obj = { a: 1 };
var  obj2 = Object.assign({}, obj);
 
console.log(obj2);  // { a: 1 }
 
// 通过 for in 循环赋值
 
var  obj1={ a: 1, b: { c: 2 }, c: 0 }
var  obj2={}
for var  key  in  obj1 ){
     obj2[key]=obj[key]
}
 
console.log(obj2);  // { a: 1, b: { c: 2 }, c: 0 }

 以上的方法中 都可以把一个对象的键值赋值给另一个对象(但是我们可以测试出来obj2修改他的键值,obj1的键值也会被修改),

这就跟我家的钥匙刚开始是一把钥匙,然后我到配钥匙的地方配了一把一模一样的钥匙,那么我的这把原来的钥匙可以开我家的门,拿我家的东西,那么配的那把钥匙,也可以打开我家的门,拿走我家的东西。

 其实我们想做的是,我们心买了一个房子,只是房子里的东西摆设跟我原来的房子是一模一样的,唯独不一样的就是,我原来家的钥匙只能开原来家的门,新家的钥匙只能开新家的门,虽然两个房子里的东西是一模一样的,但是都是没有实际的关联关系。那么这样我门需要怎么做呢。

 我们可以先看看下面的这个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 使用 Object.assign() 方法复制对象
let  obj1 = { a: 0 , b: { c: 0}};
   let  obj2 = Object.assign({}, obj1);
   console.log(JSON.stringify(obj2));  // { a: 0, b: { c: 0}}
   
   obj1.a = 1;
   console.log(JSON.stringify(obj1));  // { a: 1, b: { c: 0}}
   console.log(JSON.stringify(obj2));  // { a: 0, b: { c: 0}}
   
   obj2.a = 2;
   console.log(JSON.stringify(obj1));  // { a: 1, b: { c: 0}}
   console.log(JSON.stringify(obj2));  // { a: 2, b: { c: 0}}
   
   obj2.b.c = 3;
   console.log(JSON.stringify(obj1));  // { a: 1, b: { c: 3}}
   console.log(JSON.stringify(obj2));  // { a: 2, b: { c: 3}}

  

  我们可以看到上面 Object.assign() 的这个方法虽然可以复制我第一层的对象值,并且当我obj2修改第一层的数据时,obj1不会受到影响。

  但是我们在修改obj2 里 b 对象里的c的值得时候,这个时候 obj1 里的 b 对象里的 c 的值也发生了改变,这就说明了,Object.assign()这个方法不是深层的复制对象,只是让对象里第一层的数据没有了关联性,但是对象内的对象则跟被复制的对象有着关联性的。那么我们其实可以想象,怎么才能让他们完全没有关联性没呢。

  字符串类型 和 对象类型 肯定是没有关联性的 ,因为它们的类型都不一样,肯定是没有可比性和关联性的。 有了这样的想法我觉得我们就有办法决绝这个问题了;

  

1
2
3
4
5
6
7
// 这个最简单暴力的处理 两个对象的关联性的问题
 
   obj1 = { a: 0 , b: { c: 0}};
   let  obj3 = JSON.parse(JSON.stringify(obj1));
   obj1.a = 4;
   obj1.b.c = 4;
   console.log(JSON.stringify(obj3));  // { a: 0, b: { c: 0}}

  上面的代码已经可以体现出来我们刚才的一个假设,我们先把obj1 转成了字符串类型, 这样他就失去了对象的属性和一切的特性,然后我们再把它转成一个对象类型,这样我们心生成的对象是通过字符串转换过来的,已经是一个新的对象,然后再赋值给obj2 ,这样就相当于,我把我原来家的布置等东西,用设计稿的方式展现出来,然后我们又买了一个新家,按着原来的设计方式重构了出来,这样两个房子的内饰是一模一样的,但是门的钥匙不一样,这样就失去了以前的关联性。

以上的方法可以封装成方法方便使用

1
2
3
4
5
6
7
var  function  cloneObjectFn (obj){  // 对象复制
     return  JSON.parse(JSON.stringify(obj))
}
 
var  obj1={a:2,b{c:0}}
var  obj2=cloneObjectFn(obj1)
console.log(obj2)     // {a:2,b{c:0}}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 你可以使用 `Object.assign()` 方法将一个对象的属性(包括所有自有属性和可枚举属性)复制到另一个对象中。以下是一个示例代码: ```javascript const obj1 = { a: 1, b: 2 }; const obj2 = { c: 3 }; const obj3 = Object.assign({}, obj1, obj2); console.log(obj3); // { a: 1, b: 2, c: 3 } ``` 在这个例子中,`Object.assign()` 方法将 `obj1` 和 `obj2` 对象的所有属性复制一个对象 `obj3` 中。注意,我们传递了一个对象作为第一个参数,这个空对象将作为目标对象,所有属性都将复制到这个对象中。如果目标对象已经存在某个属性,则该属性将被覆盖。 ### 回答2: 可以通过遍历源对象的属性,将每个属性的键和值都添加到目标对象中。 ```javascript function copyObjectKeysAndValues(source, target) { for (let key in source) { if (source.hasOwnProperty(key)) { // 确保只遍历对象自身的属性,不会包括原型链上的属性 target[key] = source[key]; // 将每个属性的键和值添加到目标对象中 } } } let sourceObj = { name: 'Alice', age: 25, occupation: 'Engineer' }; let targetObj = {}; copyObjectKeysAndValues(sourceObj, targetObj); console.log(targetObj); // 输出: { name: 'Alice', age: 25, occupation: 'Engineer' } ``` 我们定义了一个`copyObjectKeysAndValues`函数,该函数接收两个参数:源对象和目标对象。在函数中,我们使用`for...in`循环遍历源对象的属性。使用`hasOwnProperty`方法来确保只遍历对象自身的属性,不会包括原型链上的属性。然后,将每个属性的键和值都添加到目标对象中。最后,可以打印出目标对象,确认键和值已经成功装进目标对象中。 ### 回答3: 在JavaScript中,可以通过以下几种方式将一个对象的键和值都装进另一个对象: 1. 使用for...in循环遍历对象的键值对,然后将它们分别添加到另一个对象中: ```javascript const sourceObj = { key1: 'value1', key2: 'value2', key3: 'value3' }; const targetObj = {}; for (let key in sourceObj) { targetObj[key] = sourceObj[key]; } console.log(targetObj); // 输出: { key1: 'value1', key2: 'value2', key3: 'value3' } ``` 2. 使用Object.assign()方法将源对象的键值对复制到目标对象中: ```javascript const sourceObj = { key1: 'value1', key2: 'value2', key3: 'value3' }; const targetObj = Object.assign({}, sourceObj); console.log(targetObj); // 输出: { key1: 'value1', key2: 'value2', key3: 'value3' } ``` 3. 使用展开运算符(Spread Operator)将源对象的键值对传递给目标对象: ```javascript const sourceObj = { key1: 'value1', key2: 'value2', key3: 'value3' }; const targetObj = { ...sourceObj }; console.log(targetObj); // 输出: { key1: 'value1', key2: 'value2', key3: 'value3' } ``` 无论使用哪种方式,都能够将一个对象的键和值都装进另一个对象中,并得到相同的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值