es6,深度拷贝
web前端-前端问答
php 输出源码,如何用vscode自我介绍,ubuntu代码鱼,tomcat7.0绿色,爬虫采集文本,php log框架,2022黑帽Seo技术论坛,简单的滚动网站lzw
什么是深度拷贝响应式 个人博客源码,ubuntu如何查看wine,在手机上爬虫,php table [],seo 推广原理lzw
深拷贝就是相对与浅拷贝而言的,最主要的差异体现在引用类型上,从本质上讲就是浅拷贝只简简单单地把栈当中的引用地址拷贝了一份,所以当你修改新拷贝出来的值的时候,被拷贝的对象也会被你修改掉;而深拷贝是会在堆内存当中为新对象建立空间,所以被拷贝的对象就不会被无缘无故地被修改掉了。android tab 源码下载,ubuntu qq 微信,爬虫自动提醒程序,filebeat php,seo软件化lzw
es6中如何实现深度拷贝方法1:使用Object.assign
Object.assign默认是对对象进行深拷贝的,但是我们需要注意的是,它只对最外层的进行深拷贝,也就是当对象内嵌套有对象的时候,被嵌套的对象进行的还是浅拷贝;
function cloneDeepAssign(obj){ return Object.assign({},obj)}
(温馨提示:数组拷贝方法当中,使用...
、slice
、concat
等进行拷贝也是一样的效果,只深拷贝最外层)
同时,我们知道Object.assign
针对的是对象自身可枚举的属性,对于不可枚举的没有效果;
所以,当我们对于一个层次单一对象的时候,可以考虑这种方法,简单快捷。(试过了,也不支持undefined)
方法2:利用JSON
这是我们最最最常提到的一种深拷贝的方式,一般大部分的深拷贝都可以用JSON的方式进行解决,本质是因为JSON会自己去构建新的内存来存放新对象。
function cloneDeepJson(obj){ return JSON.parse(JSON.stringify(obj))}
但是我们要注意的是:
会忽略 undefined
和symbol
;
不可以对Function
进行拷贝,因为JSON
格式字符串不支持Function
,在序列化的时候会自动删除;
诸如 Map
, Set
, RegExp
, Date
, ArrayBuffer
和其他内置类型在进行序列化时会丢失;
不支持循环引用对象的拷贝;(循环引用的可以大概地理解为一个对象里面的某一个属性的值是它自己)
方法3:利用jQuery的$.extend()
var array = [1,2,3,4];var newArray = $.extend(true,[],array);
显而易见,最大的缺点就是我们还需要引入jQuery库了,所以也不太常用;