对象的拷贝


layout: post
title: 对象(数组)的拷贝
date: 2017-08-31 16:10:17
tags: 学习


老生常谈

都是很老的问题了,为啥还要写,网上搜索一大堆。其实是有个小故事的,第一次面试的时候,面试官就给我出了一个拷贝的题,奈何我当时还是小白。。。什么都不懂,现在过了接近一年,刚好看到相关的东西,就顺道总结一下。

what is clone

对象拷贝(也叫复制),得到一个与已知对象看起来"相同的对象",但是本质上不是一个对象,也不是同一个引用。如果只复制一层,就叫浅复制,对象经常是多层,多层的就是深复制。

浅拷贝(shallow clone)

第一时间想到的就是遍历

const shallowClone = (current) => {
    let obj = {}
    for(let i in current){
        if(src.hasOwnProperty(i)){   // 只遍历本身的属性
            obj[i] = current[i]
        } 
    }
    return obj
}
let cur = {a:1,b:2}
console.log(shallowClone(cur))

深拷贝(deep clone)

网上大牛写的挺多的,序列化啥的。不考虑特殊情况,递归遍历应该是基本可以满足要求的,但是仅仅是基础实现,涉及到原型链上的方法之类的,暂时不作讨论。

let cur = {a:1,b:{c:2,d:{e:3}},c:function(){return 1+2 }}

const deepClone = (current) => {
    let obj = {}
    for(let i in current){
        if(current.hasOwnProperty(i)){
            obj[i] = typeof(current[i]) === 'object' ? deepClone(current[i]) : current[i]
        }
    }
    return obj
}

console.log(deepClone(cur))

还有大家公认的方法啦,弊端就是没有方法,null,undefined这些了。
Json的方法

let obj = {a:1,b:{c:2,d:{e:3}},c:function(){return 1+2 }}
let target = Json.parse(Json.stringfy(obj))
target //  {a:1,b:{c:2,d:{e:3}}} copy不了里面的方法

数组的clone

比较简单的就是split(0) 和 concat() 了,这2个方法都是没有side effects。
其他遍历的方法应该也是ok的,但是深clone可能会比较烦啦 ~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对象的拷贝 深度拷贝一个对象 java.lang.Object 根类已经定义了 clone() 方法。子类只需要事...
    WooiiiWooiii阅读 2,398评论 0 0
  • 拷贝也即是复制。那么深拷贝和浅拷贝呢? 在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数...
    avery1阅读 341评论 0 0
  • 一 :拷贝的相关概念 copy语法的目的:改变副本的时候,不会影响到源对象; 深拷贝:内容拷贝,会产生新的对象。新...
    Cheriez阅读 437评论 0 1
  • Java对象的Copy 引用CSDN博客地址:http://m.blog.csdn.net/chenssy/art...
    佩佩691阅读 915评论 0 0
  • 在JS中,有六种数据类型,分别是数值(Number)、字符串(String)、布尔型(Boolean)、undef...
    大春春阅读 1,032评论 0 3