首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Js篇-面试题7-简单实现一下对象的深拷贝

Js篇-面试题7-简单实现一下对象的深拷贝

作者头像
itclanCoder
发布2020-10-28 16:59:11
发布2020-10-28 16:59:11
4770
举报
文章被收录于专栏:itclanCoderitclanCoder

简单实现一下对象的深拷贝

考察点:基本数据类型的拷贝是赋值,而对象复杂数据类型的拷贝是赋止

解决: 递归实现深拷贝

代码语言:javascript
复制
/*
  *  *
  *  @description:把一个对象递归拷贝给另外一个对象
  *  源对象与拷贝后的对象没有引用关系,实现克隆
  *  @params {obj2} obj2为被拷贝的对象
  *  @return {obj} obj为最终拷贝出来的对象
  *  @author itclanCoder
  *  */
function deepCopy(obj2){    // 递归函数
    var obj =  isArray(obj2)?[]:{}; // 判断被拷贝对象是数组还是对象,如果不考虑数组的话,会出现一些问题,如果被拷贝对象里面有数组对象的话,会把数组变为对象,如果传进来是一个数组的话,就让它是一个数组的,是一个对象就是一个对象的
    // 取出obj2的所有属性,如果当前拷贝的数据还是一个对象的话,那么继续调用,deepCopy进行二次拷贝,递归
    for(var property in obj2){
        if(isObject(obj2[property])){
            obj[property] = deepCopy(obj2[property])  // 递归
        }else{
            obj[property] =  obj2[property]
        }
    }
    return obj;
}

// 判断一个值是不是数组
function isArray(val){
    return Object.prototype.toString.call(val) === '[object Array]';
    // 这里直接用Es6中的Array.isArray()方法判断是不是数组也是可以的,但是上面那种是一些标准库的常见用法
}
// 判断是不是对象
function isObject(val){
    return typeof val ==='object' && val !== null;
}
var obj1 = {x: 1, y: 2, z: { a:3, b: 4}}
var obj2 = deepCopy(obj1);
obj2.x = 100;
obj2.z.a = 200;
console.log(obj1, obj2);

更多关于深拷贝-浅拷贝可查看下文

javaScript中的深拷贝vs浅拷贝

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 简单实现一下对象的深拷贝
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档