写在前面

为什么要做深拷贝?

简而言之,这是由于js定义的基础数据类型和复杂数据类型的本质决定的。基础数据类型存储在堆中,拷贝赋值引用的是值,修改拷贝后的值并不会影响原值;而复杂数据类型值存储在堆中,引用地址存储在栈中,拷贝赋值的是引用地址,修改拷贝后的值会修改原先的值。

有时候需要对copy的数据进行修改,但不想破坏原先的值,这就需要做深拷贝了。

具体实现

数组的深拷贝

方法一: 利用for循环+push

let arr = [1, 2, 3, 4, 5];
let resArr = [];
for(let i = 0; i <= arr.lenght - 1; i++){resArr.push(arr[i])
}
console.log(resArr) //[1, 2, 3, 4, 5]

方法二: 利用slice截取特定范围内容不会影响原数据的方法

回忆一下slice方法:①slice数组,字符串都可用;②arr/str.slice(startIdx[包括],endNum[不包括]),例如对于上方数组里的arr,执行arr.[1,3],意思是截取从左往右数第1个元素(包含)到第3个元素它得到的结果是 [2, 3];省略end表示截取到末尾 ③负数代表从右往左数

let arr = [1, 2, 3, 4, 5];
let resArr= arr.slice(0);
console.log(resArr); //[1, 2, 3, 4, 5]

方法三: 利用concat合并空得到一个新数组

let arr = [1, 2, 3];
let resArr = arr.concat();
console.log(arr) //[1, 2, 3]

方法四:利用ES6数组的扩展运算符 ... 展开得到一个新数组

let arr = [1, 2, 3];
let arr1 = [...arr];
console.log(arr1) //[1, 2, 3]

当然还有简单粗暴 JOSN.parse(JSON.stringify(arr))

对象深拷贝

        方法一:JSON.parse(JSON.stringify())

let obj = {name: '小明', age: 18};
let newObj = JSON.parse(JOSN.stringify(obj))

        *需要注意的是,如果属性中有function则不能正确深复制

        方法二:利用ES6 对象的Object.assign()方法, 注意:也只能针对对象属性为基本类型的情况

let obj = {name: '小明', age: 18};
let obj2 = Object.assign({}, obj);

使用上面方法,只能克隆拷贝对象本身的值,而不能克隆继承的值,如果需要保持继承,使用下面方法:

let obj = {name: '小明', age: 18};
function cloneObj(originObj) {let originObjProto = Object.getPrototypeOf(originObj);return Object.assign(Object.create(originObjProto ), originObj)
}
let newObj = cloneObj(obj)

  方法三:利用for循环遍历对象,并判断子属性扔就为对象时递归,需要时调用,完美克隆对象中的function

function cloneObj(obj) {if (typeof obj !== 'object') {return obj;} else {var newobj = obj.constructor === Array ? [] : {};for (var i in obj) {newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]; }return newobj;}
}
cloneObj(需要深拷贝的obj)

暂时总结到这!!!转载请注明出处

JS数组深拷贝、对象深拷贝相关推荐

  1. js的数组和对象的多种复制和清空, 以及区分JS数组和对象的方法

    js的数组和对象的多种"复制"和"清空", 以及区分JS数组和对象的方法 一.数组清空与复制方法 1.数组清空的方法 var a = [1,2,3]; a.le ...

  2. JS 数组转对象 对象转数组 对象数组互相转换

    js 对象数组互相转换 数组转换为对象 JS 数组转对象 对象转数组 对象数组互相转换 数组对象互相转换 JS 数组转对象.对象转数组(针对嵌套深层次比较深的对象或者数组) JS 声明一个函数,arr ...

  3. Js数组转对象(特殊格式)和 JS中将对象转化为数组

    Js数组转对象(特殊格式)和 JS中将对象转化为数组 数组转化为对象特殊格式 arr:[ { } ,{ },{ }] 转化为obj:{ { },{ },{ } } 利用ES6语法: let obj = ...

  4. JS 数组转对象,JS 对象转数组

    JS数组转对象 // 原始数据 const arr = [{ label: 'title_one', val: '参数值1' }, { label: 'title_two', val: '参数值2' ...

  5. JS数组、对象、字符串常用方法汇总

    JS数组.对象.字符串常用方法汇总 前言 数组常用方法 Array.prototype.slice(start, end) Array.prototype.map() Array.prototype. ...

  6. js数组push对象覆盖问题?

    js数组push对象覆盖问题? 解释原因: 定义与循环外的对象只是把一个地址push到了数组里面,定义在外面的对象都是一个地址,所以改变得都是同一个对象里面的值 解决方法: 如果要push一个对象要先 ...

  7. js 数组、对象转json 以及json转 数组、对象

    1.JS对象转JSON 方式:JSON.stringify(obj) var json = {"name":"iphone","price" ...

  8. JS数组与对象的遍历方法大全

    本文简单解析各种数组和对象属性的遍历方法: 原生for循环.for-in及forEach ES6 for-of方法遍历类数组集合 Object.key()返回键名的集合 jQuery的$.each() ...

  9. js数组转对象,对象转数组

    1.对象转数组 var obj = {name:"张三",name:"李四",name:"王五"}; var arr = []; arr = ...

  10. 一维数组与对象深拷贝的几种方法(指数组、对象中均无嵌套)

    一.万能for循环 直接上代码: var arr = [1, 2, 3, 4, 5]var obj = { name: "aaaaa", age: 16 }var arr2 = c ...

最新文章

  1. 生活中的算法---公交换乘
  2. The Closest M Points BZOJ 3053
  3. Android开发:利用Activity的Dialog风格完成弹出框设计
  4. c++opencv显示中文_OpenCV如何入门秘籍
  5. 10大最重要的Web安全风险之三----A3,错误的认证和会话管理
  6. java如何配置maven路径_如何配置Eclipse构建路径以使用Maven依赖项?
  7. 数据结构1——堆栈和队列
  8. php dbc2000操作类,超详细菜鸟入门第一课DBC2000详细架设
  9. win7蓝屏0x0000003b解决教程
  10. 腾讯qq的授权管理查看页面
  11. JS 应用篇(一):Underfined与Null的区别
  12. vue实现二维码批量打印功能
  13. [http]http转义和加解密方法
  14. Excel导入数据(图片处理)
  15. 鲸发卡11.02免授权版本
  16. 车内看车头正不正技巧_路边侧方位实用停车技巧,学会这一招,再也不担心车头刮到前车...
  17. java GUL编程
  18. 408-数据结构-树的应用-哈夫曼树并查集
  19. 留言板分页php,关于文本留言本的分页代码
  20. gentoo安装全过程

热门文章

  1. django读取mysql里原有数据_django整合原有的mysql数据库
  2. 东方甄选三个月直播带货20亿
  3. 有若干张一元、五元、十元面值的钞票,要支付十五元有多少种方法?
  4. Drools入门介绍
  5. 一起看 I/O | 隆重推出 AI 驱动的编码助手 Studio Bot
  6. 小王不会玩的总结 目录
  7. 计算机求职英语作文,计算机专业英文求职信
  8. 华为云Kubernetes:Kubernetes概述
  9. android studio虚拟机如何使用,3.1、Android Studio在虚拟机中运行应用
  10. 商场三十六计——第35计 “连环计”