深、浅拷贝

简单来说,浅拷贝简单的处理简单数据时候就很ok

到那时遇到复杂数据类型就可能有点吃了,比如数组,你赋值了个另一个变量,这样会导致一个变量改,另一个数据也会发生改变,这或许导致很危险的东西。当然,有时候也会抛出异常,比如释放了那块内存空间,另一个数据去改变,去操作那块地址空间,很有可能会抛出异常……

深拷贝解决了上述问题,

首先,对于简单的一层的数据,我建议使用 ... 运算符

对于有多层的数据, 可是使用 JSON.parse(JSON.stringify(obj)) 来解决

局限性

  • 会忽略 undefined
  • 会忽略 symbol
  • 不能序列化函数
  • 不能解决循环引用的对象

如果你所需拷贝的对象含有内置类型并且不包含函数,可以使用 MessageChannel

使用的时候注意是一个异步的过程

function deepClone (obj) {return new Promise((resolve, reject) => {const { port1, port2 } = new MessageChannel() port2.onmessage = ev => resolve(ev.data)port1.postMessage(obj)})
}
// 返回的是一个promise对象,记得使用async和await的promise 的语法糖去解决问题或者.then()

loadsh 的深拷贝

我一般习惯使用自己写的文档来查。

当然 我挺喜欢递归的,因为递归简单,可是耗费性能。但是前端能有多大的数据呢 ^-^

function deepClone(newObj, oldObj) {  //(新数据,被拷贝数据)for (key in oldObj) {if (Array.isArray(oldObj[key])) {// 如果数据类型是数组,必须写在最上面,// 因为 ( [1,2] instanceof Object === true)newObj[key] = []deepCopy(newObj[key], oldObj[key])} else if (oldObj[key] instanceof Object) {//如果数据是对象类型newObj[key] = {}deepCopy(newObj[key], oldObj[key])} else {//数据是基本数据类型newObj[key] = oldObj[key]}}return newObj
}

js深拷贝,浅拷贝的解析以及解决方案相关推荐

  1. 详解JS深拷贝与浅拷贝

    深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存:深拷贝会另外创建一个一模一样的对象,新对象跟原对象 ...

  2. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  3. 【js】浅拷贝与深拷贝

    一.理解 1.浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址. 浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言 ...

  4. js深拷贝和浅拷贝的区别

    js深拷贝和浅拷贝的区别 如何来区分深拷贝和浅拷贝,其实简单,例如: 就是我声明一个obj对象,如何让var a直接等于obj,然后有在obj新增个fun,此时的a也会随着新增个fun,相同a新增数据 ...

  5. 前端html继承的方式,好程序员web前端教程之JS继承实现方式解析

    好程序员 web 前端教程 之JS 继承实现方式解析 , JS 是 Web 前端三要素之一,也是每一个初学前端的同学遭遇的第一条拦路虎.很多人反应 JS 学习不易,各类知识点概念及应用常常让人抓耳挠腮 ...

  6. Vue + Element UI + Moment.js——el-table-column的时间戳格式转换解决方案

    基本概念 Moment.js:JavaScript 日期处理类库 解决方案 formatter="dateFormat"绑定一个 dateFormat方法 <el-table ...

  7. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  8. c++ _int64转字符串_C语言 仿JS的eval函数 解析字符串

    C语言 利用后缀表达式解析字符串(符合c98标准,很容易移植到计算器上) 最近用98标准的C语言写了个解析字符串,类似于JavaScript中的eval函数,感觉挺实用(移植到了计算器上,可以画F(X ...

  9. MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案 MyEclipse导入jquery-1.8. ...

最新文章

  1. python高级数据结构_Python高级数据结构(二)
  2. Spring Boot 青睐的数据库连接池HikariCP为什么是史上最快的?
  3. Spring集成线程池
  4. 51nod 1402最大值
  5. 各类电脑高效率神器使用及下载地址
  6. 倒数秒跳转页面实现代码。
  7. java 自定义注解获取_Java自定义注解
  8. 中psr_PSR-SX900测评:雅马哈升级幅度较大的高品质编曲键盘
  9. Boost:测试BOOST_BIND_NO_PLACEHOLDERS的程序
  10. Batch Normalization原理及pytorch的nn.BatchNorm2d函数
  11. vue js 反编译_学会了Vue,前端面试却没找到工作?
  12. lucene学习-3 - 代码重构
  13. Go语言基础练习题系列1
  14. M - Corporate Identity(多组字符串匹配问题)
  15. 笔记︱精准营销解决方案以及营销组合评估
  16. 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
  17. 分享一款超强看图软件。极速看图。这些看图软件比系统自带的强大多了!
  18. 重力加速度陀螺仪传感器MPU-6050(一)
  19. 阿里巴巴android开发规范,阿里巴巴开发手册|阿里巴巴Android开发手册 PDF电子版_最火软件站...
  20. 17期-什么是MySQL数据库?看这一篇干货文章就够了!

热门文章

  1. Kafka Consumer多线程消费
  2. 简述分布式一致性协议(2pc、3pc、paxos、zab)
  3. Spark中RDD转换成DataFrame的两种方式(分别用Java和scala实现)
  4. Ubuntu 16.04安装Cobbler 2.9
  5. mysql heartbeat 高可用
  6. Java 中静态方法 实例方法 具体方法区别与联系
  7. 【EASYDOM系列教程】之创建页面元素
  8. IOS学习之数据库(6)--SQLite常用的函数
  9. 【MySql】在Linux下安装MySql数据库
  10. Tasker 正则表达式测试器