最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS深拷贝

    正文概述 掘金(未i)   2021-06-18   490

    什么是深拷贝?

    对于字符串类型,浅拷贝是对值的拷贝,对于对象来说,浅拷贝是对对象地址的拷贝,并没有开辟新的栈,也就是拷贝的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变。

    而深拷贝则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。深拷贝指的是对象属性所引用的对象全部进行新建对象拷贝,以保证深拷贝的对象的引用图不包含任何原有对象或对象图上的任何对象,隔离出两个完全不同的对象图。

    深拷贝的两种常用方法:

    一. json方法

    var targetObj = JSON.parse(JSON.stringify(Obj))

    let targetArr = JSON.parse(JSON.stringify(arr))

    原理:用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,对象会开辟新的栈,实现深拷贝

    缺点

    1. 会抛弃对象的constructor,也就是深拷贝之后,无论这个对象原本的构造函数是什么,在深拷贝之后都会变成Object。即,无法拷贝copyObj对象原型链上的属性和方法
    2. RegExp对象是无法通过这种方式深拷贝的,同样function函数也无法转成JSON被拷贝下来

    二. 递归方法

    function deepClone( source ) {
        //如果不是对象的话直接返回
        if (typeof source !== 'object' || source == null){
            return source; 
        }
        //判断是对象还是数组,初始化
        let target = Array.isArray( source ) ? [] : {} 
        
        for ( var k in source ) {
        	if (source.hasOwnProperty(k)) {    //保证k不是原型上的属性
                if ( typeof source[ k ] === 'object' ) {
                	target[ k ] = deepClone( source[ k ] )    //递归
                } else {
                	target[ k ] = source[ k ]
                }
        	}
        }
        return target
    }
    

    原理: 在浅拷贝部分的原理是一样的,如果第一层键名/下标 对应的是基础类型的值,就直接赋值,如果是引用类型的值,采用递归的方式,进入到这个引用类型的值。到了第二层,循环操作第一层的步骤。


    起源地下载网 » JS深拷贝

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元