博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 对象操作赋值操作
阅读量:4510 次
发布时间:2019-06-08

本文共 2250 字,大约阅读时间需要 7 分钟。

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

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

// 直接赋值 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的键值也会被修改),

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

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

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

// 使用 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()这个方法不是深层的复制对象,只是让对象里第一层的数据没有了关联性,但是对象内的对象则跟被复制的对象有着关联性的。那么我们其实可以想象,怎么才能让他们完全没有关联性没呢。

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

// 这个最简单暴力的处理 两个对象的关联性的问题   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 ,这样就相当于,我把我原来家的布置等东西,用设计稿的方式展现出来,然后我们又买了一个新家,按着原来的设计方式重构了出来,这样两个房子的内饰是一模一样的,但是门的钥匙不一样,这样就失去了以前的关联性。

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

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}}

 

转载于:https://www.cnblogs.com/xieli26/p/10729110.html

你可能感兴趣的文章
ClickOnce清单签名取消后依然读取证书的问题
查看>>
POJ 1083
查看>>
IIS7的HTTP到HTTPS的重定向
查看>>
学习安排
查看>>
帝国cms 列表页分页样式修改美化【2】
查看>>
PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
查看>>
2808 SCI 中断接收
查看>>
51单片机 | 定时器中断应用实例
查看>>
011 查找结点,创建节点,插入节点以及小练习
查看>>
Linux 7个运行级别(0:关机,停机模式、1:单用户模式、2:多用户模式、3:完整的多用户文本模式、4:系统未使用,保留一般不用、5:图形化模式、6:重启模式)、重置root密码方法...
查看>>
UITableViewCell的4种显示格式
查看>>
类之string类、Math类、DateTime类
查看>>
linux系统中如何确定是否存在某个命令
查看>>
安防RTSP无插件直播方案及RTSP配置规则
查看>>
[转载]oracle的表导入导出,表空间,用户名
查看>>
iOS小技巧:用runtime 解决UIButton 重复点击问题
查看>>
POJ 2253 Dijkstra
查看>>
闲言碎语话心得--凭什么是他(她)
查看>>
20130328
查看>>
UITableViewCell contentView layoutSubviews 死循环
查看>>