博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一文搞懂前端对象的深拷贝与浅拷贝
阅读量:6591 次
发布时间:2019-06-24

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

在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝。

一、javascript中的数据类型

  • 基础数据类型
    • 字符类型
    • 数字类型
    • 布尔类型
  • 引用数据类型(地址的引用)
    • 对象
    • 数组

二、浅拷贝的代码

  • 1、自己实现浅拷贝

    let obj1 = {
    name: '张三', gender: '男', bookList: ['张三', '李四']};let obj2 = {};for (let key in obj1) {obj2[key] = obj1[key];}obj1.name = '李四';obj1.bookList.push('王五');console.log(obj1);console.log(obj2);复制代码
  • 2、关于浅拷贝的问题

    • 对象的浅拷贝如果是针对于基础数据类型来说,可以拷贝,修改后不会出现问题。
    • js中引用数据类型(数组、对象)仅仅是地址的拷贝,如果修改了之前的数据,拷贝后的数据也会修改。
  • 3、ES6中直接使用Object.assign()对象的静态方法来进行对象的浅拷贝,不需要自己手写拷贝方法。

三、深拷贝

深拷贝相对于浅拷贝来说,对于拷贝后的引用数据类型,是真实的开辟了一块新的内存空间,修改了之前的旧数据,拷贝后的数据也不会变化。

  • 1、实现一个深拷贝的方法

    let obj1 = {  name: '张三',  age: 20,  bookList: ['三国演义', '西游记'],  goodFriends: {    name: '李四',    age: 19,    bookList: ['java']  },  birthday: new Date()}/** * 对象的深拷贝 * @param toObj 要拷贝到的对象 * @param fromObj 从哪个对象中拷贝 */function deepCopyObject(toObj, fromObj) {  // 这个地方判断只要是对象就可以,不存在数组、对象、时间之分  const _isObject = (obj) => Object.is(typeof obj, 'object');  for (let key in fromObj) {    let fromObjValue = fromObj[key];    // 如果不是对象就直接拷贝到新的对象上    if (!_isObject(fromObjValue)) {      toObj[key] = fromObjValue;    } else {      // 创建一个新对象      let temObj = new fromObjValue.constructor;      // 递归调用      deepCopyObject(temObj, fromObjValue);      toObj[key] = temObj;    }  }};let newObj = {};deepCopyObject(newObj, obj1);obj1.bookList.push('红楼梦');console.log(newObj);console.log(obj1);复制代码

四、使用JSON.parse()JSON.stringify()对对象进行拷贝

var clone = function (obj) {    return JSON.parse(JSON.stringify(obj));}复制代码

五、在实际项目开发过程中使用

  • 1、深拷贝使用cloneDeep方法

六、

转载地址:http://pqkio.baihongyu.com/

你可能感兴趣的文章
Python去掉字符串中空格的方法
查看>>
[转] 用GDB调试程序(五)
查看>>
OCM_第十一天课程:Section5 —》数据仓库
查看>>
来自一个用户的体验-Alpha项目测试
查看>>
水晶报表
查看>>
[转载]测试程序执行时间
查看>>
[转载]回调函数
查看>>
kettle-多文件合并
查看>>
GitHub for Windows一般操作
查看>>
MyEclipse6.5的反编译插件的安装
查看>>
Jenkins + Ansible + Gitlab之ansible篇
查看>>
cogs 539. 牛棚的灯
查看>>
SQL SERVER 备份数据库到指定路径语句
查看>>
3.Knockout.Js(属性绑定)
查看>>
C++三大特性之多态
查看>>
v140平台工具集与v110工具集选择
查看>>
EF6+Sqlite连接字符串的动态设置
查看>>
下拉加载更多
查看>>
您是哪一种类型的老板?
查看>>
SQL SERVER 2012 只能识别20个CPU的问题
查看>>