js 对象操作 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象
我最近在做一个vue + element-UI + vue-resource + vuex项目的时候,遇到了一个对象的问题。

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

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

// 直接赋值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/xuanyubk/p/7779420.html

js 对象和对象赋值 去除关联性。相关推荐

  1. js对象的直接赋值、浅拷贝与深拷贝

    最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期 ...

  2. js之删除对象中的属性——delete、es6解构赋值、自执行匿名函数

    js之删除对象中的属性--delete.es6解构赋值.自执行匿名函数 实例 const person = {name: '李世民',gender: 'male',age: 24 };// 删除目标对 ...

  3. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比

    JS中集合对象(Array.Map.Set)及类数组对象的使用与对比 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java ...

  4. 前端之JavaScript:JS之DOM对象一

    js之DOM对象一 一.什么是HTML  DOM HTML  Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 ...

  5. 【CyberSecurityLearning 50】JS 基础+函数+对象+事件

    目录 JavaScript简介: JS 简单的语句 如何在HTML中引入JS代码 变量 声明变量 变量类型 null和undefined 数组 对象 流程控制 if语句判断 for循环 for ... ...

  6. js 数组 ajax php,js里面的对象ajax post到php端直接变成数组了?

    本帖最后由 zhoumengkang 于 2013-09-12 10:03:14 编辑 事先引入了jquery var str ="{'a':'b','aa':'bb'}";var ...

  7. 5.14 js对象 函数 js操作document对象

    ---对象  var myObject ={}  /* 声明对象字面变量*/ myObject点语法取值 赋值 代码格式   var person = {    name : "zhangs ...

  8. js判断对象是否为空对象_js对象

    七种数据类型 number string bool symbol undefined null object 五个Falsy 值 undefined null 0 NaN '' 对象 object 第 ...

  9. js中的对象、原型链机制、构造函数

    一.在js中创建对象的方式 //一.字面量或直接量创建对象var obj1 = {name:"zs",age:12}; //二.通过new来创建对象var obj2 = new O ...

最新文章

  1. Vue 组件库 HeyUI@1.19.0 发布,新增 Icon 图标
  2. Android EditText如何去除边框添加下划线
  3. python中rim的用法_Python笔记(六)_函数
  4. java action 上传文件_JavaWeb框架_Struts2_(七)-----文件的上传和下载
  5. 数据结构之二叉树:折纸问题——11
  6. qt5 操作mysql 代码_qt5使用mysql
  7. Pycharm 手把手安装(更新于2020-08-05)
  8. maven mirror repository
  9. iOS页面间跳转的方式
  10. 前端的ajax缓存,解析jquery中的ajax缓存问题
  11. matlab函数句柄介绍
  12. 第三届中青杯B题思路
  13. [Python] 必应搜索主页的背景图片爬虫
  14. 计算机上fn按键,fn键设置方法
  15. 文件共享服务器热备,两台云服务器如何实现双机热备
  16. 删除磁盘管理中的OEM分区
  17. python 抽奖库_用 python 写一个年会抽奖小程序
  18. U盘内存卡数据丢失怎么恢复,这样操作也可以
  19. 【sdx62】PBL阶段修改GPIO操作
  20. linux中raid扩容,Linux停软Raid1扩容方案

热门文章

  1. android java websocket client_websocket服务端,android客户端示例
  2. OSI七层协议模型、TCP/IP四层模型学习笔记
  3. GraalVM Native Image
  4. virtualbox虚拟机安装在笔记本上使用WIFI无法上网
  5. iOS TabBar中间凸起实践
  6. layui实现下拉多选列表(xm-select.js插件使用,后台添加或修改数据回显提交问题总结)
  7. 几何公差之几何要素定义之间的相互关系是怎样的?
  8. 计算机本科毕业答辩的自述,计算机本科毕业论文答辩自述范本
  9. 武汉大学计算机学院硕士英语作文,2016年考研英语作文必背范文:Dreams/ objectives(梦想/目标)...
  10. 2021年PMP报考信息大合集