在项目中,经常会用到拷贝。

浅拷贝和深拷贝,相信大家都知道区别,但是怎么去实现呢?

我会分享一些项目中经常会用到的一些方法,然后再手写一个深/浅拷贝的方法。

1. Object.assign

相信这个很多人都用过,用过就知道,这个在微信端,ie11或更低版本的ie上并不支持。所以我们就抛弃了这种方法。

这种方法也只是浅拷贝,不能满足深拷贝的需求

2. 通过es6的扩展运算符...来实现浅拷贝

let a = {age: 1
}
let b = { ...a }
a.age = 2
console.log(b.age) // 1

通常,浅拷贝只能解决部分问题。所以我们来看看深拷贝。

3. JSON.parse(JSON.stringify(object))

这个方法在项目中用的挺多的。

let a = {age: 1,jobs: {first: 'FE'}
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE

但是该方法有局限性:

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

自己实现一个深拷贝是很困难的,因为有很多便捷情况需要考虑。比如原型链,dom如何处理。所以我是根据项目实现的一个简易版的深、浅拷贝。

推荐一个库: lodash

    var isObject = function(obj) {return obj !== null && (typeof obj === "object" || typeof obj === "function")};var clone = function(obj, deep) {if (!isObject(obj)) {throw new Error(obj + " is not object");}var newObj;var cloneArray = function(item) {var newItem = [];var size = item.length;for (var i = 0; i < size; i++) {var vk = item[i];if (deep && isObject(vk)) {newItem[i] = clone(vk, deep);} else {newItem[i] = vk;}}return newItem;};var cloneObject = function(item) {var newItem = {};Object.keys(item).forEach(function(n) {var v = item[n];if (deep && isObject(v)) {newItem[n] = clone(v, deep);} else {newItem[n] = v;}});return newItem;};if (obj instanceof Array) {newObj = cloneArray(obj);return newObj;}newObj = cloneObject(obj);return newObj;}

测试代码:

    var obj1 = {a: 1,b: ["a", "b"]};var obj2 = {b: 2,c: obj1};var obj3 = clone(obj2, true);var obj4 = clone(obj2, false);obj1.b = ["a", "b", "c"];obj1.a = "2";console.log(obj3);console.log(obj4);

输出结果:

从结果可以看出:

深拷贝obj3的结果不会因为引用类型obj1的改变而改变

浅拷贝obj4的结果会因为引用类型obj1的改变而改变

转载于:https://www.cnblogs.com/thonrt/p/10334483.html

js - 浅拷贝和深拷贝相关推荐

  1. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  2. JS: 浅拷贝vs深拷贝 | 刷题打卡

    1. 概念 在JavaScript中,拷贝一般是指变量的复制过程. 对于简单类型,拷贝就是直接赋值的过程: 对于复杂类型,浅拷贝是指复制对象的引用地址的过程.如果修改了源对象的某个属性,由于引用相同, ...

  3. js之浅拷贝和深拷贝

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

  4. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  5. js 浅拷贝直接赋值_js 深拷贝 vs 浅拷贝

    本文主要讲一下 js 的基本数据类型以及一些堆和栈的知识和什么是深拷贝.什么是浅拷贝.深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝. 本文思维导图如下:本文思维导图 堆和栈的区别 其实深拷 ...

  6. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

  7. js 浅拷贝直接赋值_浅析JavaScript解析赋值、浅拷贝和深拷贝的区别

    一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为: 1.基本数据类型:赋值,赋值之后两个变量互不影响 2.引用数据类型:赋**址**,两个变量具有相同的引用,指向同一个对象,相互之 ...

  8. js 浅拷贝直接赋值_JS中的赋值、浅拷贝与深拷贝

    作者:奚杰 拷贝是写代码中经常使用的方法.浅拷贝与深拷贝是指拷贝的两种情况.本文将深入探究JS的赋值.浅拷贝与深拷贝. 数据类型 在探究深拷贝与浅拷贝之前,我们先梳理一下JS的数据类型.在JavaSc ...

  9. 理清JS中的深拷贝与浅拷贝

    作者:Manjula Dube译者:前端小智来源:Medium 为了保证的可读性,本文采用意译而非直译. 浅拷贝是对象的逐位复制.创建一个新对象,该对象具有原始对象中值的精确副本.如果对象的任何字段是 ...

最新文章

  1. BaaS, IaaS, PaaS, SaaS介绍
  2. 禁止Win7系统自动安装驱动程序
  3. java链式编程_Java 链式编程 和 lombok 实现链式编程
  4. java 阻塞队列 LinkedBlockingQueue ArrayBlockingQueue 分析
  5. boost::replace_copy相关的测试程序
  6. EtherCAT是什么?
  7. dll domodal运行时异常_解决装备疑难,计算机丢失***.dll文件方法「设计画圈」
  8. Java测试题及答案(Java干货完整试卷)
  9. 3D打印机改装雕刻机经验分享
  10. 佛系前端面试题记录--第三周
  11. 计算机图形学——Liang-Barsky算法
  12. 使用 spring.profiles.active 及 @profile 注解 动态化配置内部及外部配置
  13. ElasticSearch读流程
  14. linux下如何打开iso文件夹,Linux下打开ISO文件两种方法
  15. 【干货】如何利用 pandas 批量合并 Excel?
  16. Unity矩阵乘法的区别
  17. uni-app开发经验分享二十二: uni-app大转盘思路解析
  18. 软件测试面试题整理(十一)之软件测试理论(技术)——终极篇
  19. 计算机论文的摘要和关键词是什么意思,什么是论文的摘要、关键词
  20. Asp.Net OA 集成RTX(腾讯通)开发实践

热门文章

  1. C++, C#, Java, VB.NET,到底该选择哪一门语言?
  2. Spring Cloud学习笔记-002
  3. 剑指offer试题(PHP篇一)
  4. mysql数据备份常用命令
  5. Window右键添加“用vim打开”
  6. jquery基本操作笔记
  7. 【MySQL】navicat for mysql 10.1.7注册码
  8. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法
  9. 【转】Maya Mel – Search String in String
  10. CentOS 5.x 系统下使用yum 升级php到5.2.x