写前端的时候经常会遇到对象的拷贝,一般我们会用到深拷贝,深拷贝就是完完整整的将一个对象从内存中拷贝一份出来,放到另一块新开辟的内存中去。向下面这种赋值是浅拷贝,a、b都是对同一块内存进行引用,a、b哪一个变量修改对象的属性值都会相互影响。总结一下常用的对象深拷贝以及数组对象的深拷贝。

var a = {id:"",name:""}
var b = a;
1. 序列化转成json字符串深拷贝,以及存在的问题
2. Object.assign()深拷贝,以及存在的问题
3. 循环递归深拷贝

一、序列化转成json字符串深拷贝

例:

let source = {"id":1};
//序列化转成json字符串
let jsonStr = JSON.stringify(source)
//反序列化为对象
let target = JSON.parse(jsonStr);

存在的问题:
此方法仅在原对象包含可序列化值类型且没有任何循环引用时才有效。不可序列化值类型的一个例子是 Date 对象 - JSON.parse 只能将其解析为字符串而无法解析回其原始的 Date 对象

注:
同时总结java的序列化
序列化:就是把一个java对象转成字节流
反序列化:就是把字节流转成java对象
当然序列化不仅仅可以是转成字节流或者json字符串,还有很多种方式
为什么在java对象要序列化,什么场景要序列化?
如果没有序列化,怎么把一个在内存里面的对象保存到文件里面去,怎么把内存的对象通过网络传输到另一台计算机的内存去呢?序列化就是把内存的对象转成字节流或者json字符串等方式进行传输用的,用在一些保存对象到文件、网络传输对象等io流传输对象的场景。

二、Object.assign()深拷贝

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
基本语法:Object.assign(target, …sources)
例:

var source = {"id":1,name:"lin"};
var target = Object.assign({},source);

这样就可以把source对象里面的相同属性值拷贝到target对象

存在的问题:
如果要拷贝的对象source里面的属性不是基础类型也是对象,或者属性含有对象数组,这种方式的拷贝就不会把source对象里面的对象或者数组对象进行深拷贝
例:

var source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]};
var target = Object.assign({},source);

这时target里面的属性list数组对象只是浅拷贝source里面的list,还是对同一块内存的引用
也可以向下面这样优化,循环list数组里面的对象进行Object.assign拷贝,添加到一个新的数组去,然后再赋值给target.list
例:

let source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]};
let target = Object.assign({},source);
//对象数组的深拷贝
let newlist = [];
for(let i=0;i<target.list.length;i++){let obj = Object.assign({}, target.list[i]);newlist.push(obj);
}
target.list = newlist;

注:如果对象里面还含有对象属性,而里面的对象属性又含有对象属性,则这种方式很麻烦不合适。

三、循环递归深拷贝

function deepClone(obj, newObj) {var newObj = newObj || {};for (let key in obj) {if (typeof obj[key] == 'object') {let isArray = Array.isArray(obj[key]);//判断是否数组newObj[key] = (isArray == true ? [] : {})deepClone(obj[key], newObj[key]);} else {newObj[key] = obj[key]}}return newObj;
}

参考:
网友haogemr的js 深度拷贝的几种方法

js 对象深拷贝、对象数组深拷贝的几种方法总结相关推荐

  1. 3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景|判断数组里有没有某对象,有不添加,没有则添加到数组

    3.js中判断数组中是否存在某个对象/值,判断数组里的对象是否存在某个值 的五种方法 及应用场景 一.当数组中的数据是简单类型时: 应用js中的indexof方法:存在则返回当前项索引,不存在则返回 ...

  2. 两个对象数组去重的3种方法

    两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...

  3. JS JavaScript中去除数组中重复元素的方法

    JS JavaScript中去除数组中重复元素的方法 感觉比较好理解的3种方法,总结一下,大家共同学习 方法一: Array.prototype.method1 = function(){ var a ...

  4. 数组拼接html js,js数组合并的几种方法

    JS合并数组的几种方法及优劣比较 var datas = [ ['红色', '蓝色'], ['XL'], ['图片', '文字'] ]; 如何 将let datas = [[1, 2], [3,0,5 ...

  5. java中给对象的List集合去重的几种方法(Lambda)

    java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...

  6. JS数组添加元素的三种方法

    JS数组添加元素的三种方法 1.push() 方法可以向数组末尾添加一个或多个元素,并且返回新的长度 语法:arr.push(element1,element2,element3,····) 参数 概 ...

  7. js 多个数组拼接的几种方法

    数组拼接的几种方法 1.使用concat组装拼接数据 concat 拼接数组有好几种方式,看你喜欢用哪种 第一种,连接两个或多个数组,推荐使用这种 推荐 var arr1 = ["张三&qu ...

  8. 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法

    在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...

  9. 【转】C#中数组复制的4种方法

    C#中数组复制的4种方法 from:http://blog.csdn.net/burningcpu/article/details/1434167 今天旁边的同事MM叫我调了一段程序,她想复制一个数组 ...

  10. java 数组效率_java数组复制的四种方法效率对比

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

最新文章

  1. 我爱我家 CIO 刘东颖:如何靠六大维度提升“数字化”能力?|鲸犀峰会
  2. DS之信息挖掘:利用pandas库统计某一列col中各个值出现的次数(降序输出)
  3. 【Python】异常捕获
  4. 焦旭超 201771010109《面向对象程序设计课程学习进度条》
  5. 一行Python代码制作动态二维码
  6. 在线二进制转文本工具
  7. 法拉利杀手Koenigsegg CCX
  8. android SDK 常见安装方法
  9. (时间表达式)定时任务Quartz 之 cron表达式及在线生成器
  10. 160603、使用pd4ml.jar和ss_css2.jar转pdf的工具类
  11. 天池-小布助手对话短文本语义匹配 复赛rank3、决赛rank4代码及解决方案
  12. [并查集]BZOJ 1050——[HAOI2006]旅行comf
  13. NVIDIA GeForce RTX 3080 with CUDA capability sm_86 is not compatible with the current PyTorch
  14. 解决idea控制台中文乱码问题
  15. docker学习——杂记
  16. Microsoft Word 教程「7」,如何在 Word 中显示标尺?
  17. 软件架构(CS结构/BS结构)
  18. 8g内存学习计算机专业够吗,电脑内存4G和8G差距能有多大?电脑装机内存多大合适?...
  19. C语言入门非常简单!神级程序员五分钟带你入门!这就是学习效率
  20. 关于35岁程序员失业的问题

热门文章

  1. 【Mo 人工智能技术博客】使用 Seq2Seq 实现中英文翻译
  2. 【调剂】湖南大学电子科学与技术专业2023年硕士研究生调剂公告
  3. 华为,我的第一份“卖身契”(笔试与面试经历)
  4. vue 前端ui框架_vue前端框架
  5. 《城堡战法》实战解读2
  6. shell脚本中awk应用,数组的定义使用
  7. 树的3种常用链表结构
  8. 4.门锁系统——卡片识别
  9. python逐行读取txt写入excel_python 读取txt中每行数据,并且保存到excel中的实例
  10. 33复杂美区块链核心技术Chain33开发平台系统特点