为什么会用到浅拷贝和深拷贝

首先来看一下如下代码

let a = b = 2
a = 3
console.log(a)
console.log(b)
let c = d = [1,2,3]
let e = f = {a:1,b:2,c:3}
c[0] = 2
e.a = 2
console.log(d[0])
console.log(f.a)

你会发现,同一个Array或者Object赋值给两个不同变量时,变量指向的是同一个内存地址,所以就会造成其中一个变量改变属性值,同时改变了另外一个变量的对应属性值。

而大多数实际项目中,我们想要的结果是两个变量(初始值相同)互不影响。所以就要使用到拷贝(分为深浅两种)

深浅拷贝的区别

浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。
浅拷贝有效性针对的是单一层级对象 [1,2,3]或者{a:1,b:2}
深拷贝有效性针对的是单层或者多层级对象 [1,2,3]或者{a:1,b:2}或者[1,[1],{a:1}]或者{a:[1],b:{c:2}}

浅拷贝

  • 如何实现
// 数组
let a = [1,2]
let b = a.slice()
// {}
let e = {a:[1],b:{d:1},2}
let f = Object.create(e)
function shallowCopy (obj) {
if (typeof obj === 'object' && obj !== null) {
if (Array.isArray(obj)) {
return obj.slice()
} else {
let result = {}
Object.keys(obj).forEach((item,i) = > {
console.log(i)
result[item] = obj[item]
})
return result
}
} else {
return obj
}
}
  • 应用场景
    对于一层结构的Array和Object想要拷贝一个副本时使用
    vue的mixin是浅拷贝的一种复杂型式

深拷贝

  • 如何实现
// 利用JSON(它能正确处理的对象是Number, String, Boolean, Array, 扁平对象)
let g = JSON.parse(JSON.stringify(obj))
// 适用于
function deepCopy (obj) {
if (typeof obj === 'object' && obj !== null) {
let objKeys = Object.keys(obj)
let result
if (Array.isArray(obj)) {
result = []
} else {
if (obj.constructor === Object) {
result = {}
} else {
return obj
}
}
objKeys.forEach((item) => {
if (typeof obj[item] === 'object' && obj[item] !== null) {
switch (obj[item].constructor) {
case Array:
result[item] = deepCopy(obj[item])
break
case Object:
result[item] = deepCopy(obj[item])
break
case Date:
result[item] = new Date(obj[item])
break
case RegExp:
let attributes = ''
attributes += obj[item].global ? 'g' : ''
attributes += obj[item].ignoreCase ? 'g' : ''
attributes += obj[item].multiline ? 'g' : ''
result[item] = new RegExp(obj[item].source, attributes);
break
default:
result[item] = obj[item]
break
}
} else {
result[item] = obj[item]
}
})
return result
} else {
return obj
}
}
  • 应用场景
    复制深层次的object数据结构
  • 对深拷贝的应用想法
    在实际工作中是不是用继承来实现更好?需要大家来讨论,提意见

js的浅拷贝和深拷贝和应用场景的更多相关文章

  1. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

  2. Javascript/js 的浅拷贝与深拷贝(复制)学习随笔

    js变量的数据类型值分基本类型值和引用类型值. 在ES6(ECMAScript6)以前,基本数据类型包括String.Number.Boolean.Undefined.Null. 基本类型值的复制(拷 ...

  3. js实现浅拷贝和深拷贝

    实现浅拷贝和深拷贝 1. 浅拷贝和深拷贝的区别 简单点说,浅拷贝拷贝完后,修改拷贝的内容可能会对源内容产生影响.而深拷贝就是拷贝前后的内容相互不影响.       那为什么拷贝前后的内容会相互影响呢? ...

  4. [转] js对象浅拷贝和深拷贝详解

    本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = ...

  5. js中浅拷贝和深拷贝以及深拷贝的实现

    前言:2019年的第一篇分享... 一.什么是基本类型值和引用类型值?ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型.基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构 ...

  6. 小tips:JS之浅拷贝与深拷贝

    浅拷贝: function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; } 深拷贝: functio ...

  7. js相关--浅拷贝和深拷贝

    1.js的数据类型 基本概述:js的数据类型分为两种,分别为基本数据类型和引用数据类型,它们俩的区别在于基本数据类型采用值传递,引用数据类型采用指针形式传递. 如下所示:引用类型通过简单的=进行复制, ...

  8. JS的浅拷贝与深拷贝

    浅拷贝 //这样的拷贝有一个问题.那就是,如果父对象的属性等于数组或另一个对象,//那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能. function exten ...

  9. js之浅拷贝与深拷贝

    浅拷贝:只会复制对象的第一层数据 深拷贝:不仅仅会复制第一层的数据,如果里面还有对象,会继续进行复制,直到复制到全是基本数据类型为止 简单来说,浅拷贝是都指向同一块内存区块,而深拷贝则是另外开辟了一块 ...

随机推荐

  1. 从入门到自闭之Python 基础习题训练

    """ name = input(">>>")通过代码来验证name变量是什么数据类型? """ na ...

  2. CSP-S全国模拟赛第三场 【nan死了】

    mmt 居然第一步膜化乘除 都没看出来,没救了... 大概是贡献前缀和优化的做法 巨兔式讲解:大家都学会了么? 咱发现有大量的 (i/j , i%j ) 同时 对很多 c 产生了贡献,咱可以去优化这一 ...

  3. php文件上传错误信息说明对照表

    php文件上传错误信息说明对照表: UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini中upload_ma ...

  4. asp.net运行原理及机制

    当一个HTTP请求到服务器并被IIS接收到之后,IIS首先通过客户端请求的页面类型为其加载相应的.dll文件,然后在处理过程中将这条请求发送给能够处理这个请求的模块.在ASP.NET 3.5中,这个模 ...

  5. 6.纯css绘制叮当猫

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Centos7安装RocketMQ4.4

    网上的教程坑贼鸡儿多 一.安装maven RocketMQ依赖maven打包,所以先要在虚拟机中安装maven,我使用的是v3.3.9. 1:进入指定目录下载maven 包 cd /usr/local ...

  7. ACM常用之 异或运算的性质。

  8. 关于PHP://input

    $data = file_get_contents("php://input");    php://input 是个可以访问请求的原始数据的只读流. POST 请求的情况下,最好 ...

  9. AUC计算方法

    本质是ROC曲线下的面积,ROC曲线x轴是误判率/误报率(false positive rate),y轴是准确率/命中率(true positive rate). AUC是ROC曲线与横轴所围的面积. ...

  10. Generative Adversarial Nets(GAN Tensorflow)

    Generative Adversarial Nets(简称GAN)是一种非常流行的神经网络. 它最初是由Ian Goodfellow等人在NIPS 2014论文中介绍的. 这篇论文引发了很多关于神经 ...