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

    正文概述 掘金(天天要nx)   2021-05-28   475

    深拷贝是面试的一个重要考点,要理解实现一个深拷贝的过程,下面将分析实现一个对象深拷贝的过程。

    基本环境

    • 首先要保证电脑已经安装node.js,可通过终端node -v查看版本,对版本不作要求,具体安装过程可搜索相关博客。
    • npm是node的一个包管理工具,使用npm install http-server -g命令安装一个简单的静态服务器,使得网页能够在服务器上运行起来,相关命令是http-server -p 端口号

    实现过程

    1. 封装一个深拷贝函数,调用此函数即可进行拷贝
    2. 对传入的参数进行判断,如果是null或不是对象或数组,直接返回,不进行深拷贝。
    // 深拷贝函数
    function deepClone(obj={}) {
        if(typeof obj !== 'object' || obj == null){
            // obj 是null,或者不是对象和数组,直接返回
            return obj
        }
        
    }
    
    1. 初始化返回结果,判断传入的参数是数组还是对象,如果是数组返回一个空数组,否则返回一个空对象
    // 深拷贝函数
    function deepClone(obj={}) {
        if(typeof obj !== 'object' || obj == null){
            // obj 是null,或者不是对象和数组,直接返回
            return obj
        }
    
        //初始化返回结果
        let result
        if(obj instanceof Array){
            result=[]
        }else{
            result={}
        }
    
        // 返回结果
        return result
        
    }
    
    1. 使用循环遍历数组或对象的每一项,判断每一项,使用obj.hasOwnProperty(key)保证 key不是原型链属性,然后对每一项进行递归,判断每一项类型,根据不同类型返回不同结果,追加至result里面,最后返回result即拷贝成功。
    // 深拷贝函数
    function deepClone(obj={}) {
        if(typeof obj !== 'object' || obj == null){
            // obj 是null,或者不是对象和数组,直接返回
            return obj
        }
    
        //初始化返回结果
        let result
        if(obj instanceof Array){
            result=[]
        }else{
            result={}
        }
    
        for(let key in obj){
        // 保证 key 不是原型的属性
            if(obj.hasOwnProperty(key)){
                // 递归调用
                result[key]=deepClone(obj[key])
            }
        }
    
        // 返回结果
        return result
        
    }
    

    使用以上封装的函数,实现一个深拷贝的例子

    const obj1={
        age:20,
        name:'xxx',
        address:{
            city:'beijing'
        },
        arr:['a','b','c','d']
    }
    
    const obj2=deepClone(obj1)
    obj2.address.city='shanghai'
    console.log(obj1.address.city); // beijing
    
    // 深拷贝函数
    function deepClone(obj={}) {
        if(typeof obj !== 'object' || obj == null){
            // obj 是null,或者不是对象和数组,直接返回
            return obj
        }
    
        //初始化返回结果
        let result
        if(obj instanceof Array){
            result=[]
        }else{
            result={}
        }
    
        for(let key in obj){
            if(obj.hasOwnProperty(key)){
                // 递归调用
                result[key]=deepClone(obj[key])
            }
        }
    
        // 返回结果
        return result
        
    }
    

    起源地下载网 » 如何手写一个深拷贝?

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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