美文网首页js
深浅拷贝

深浅拷贝

作者: 马甲要掉了 | 来源:发表于2020-05-19 11:17 被阅读0次
  • 浅拷贝
    将原对象/原数组的引用直接赋值给新对象/新数组,新对象/新数组只是原对象/原数组的一个引用。
  • 深拷贝
    将原对象中各项属性的值(数组的所有元素)都拷贝过来,是“值”而不是“引用”,在改变新的数组/对象的时候,不改变原数组/对象。

浅拷贝方法

  1. Object.assign()
let a = {
   age:{
         name:2,
   }
}
let b = Object.assign({},a);
a.age.name = 22;
console.log(b.age.name)  //22
  1. ...拓展运算符
  let a = {
      age:{name:2}
  }
let b = {..a};
a.age.name = 22;
console.log(b.age.name);  //22

浅拷贝只能解决第一层的问题,如果接下去的值中还有对象的话,那么就又回到最开始的话题了,两者享有相同的地址。

深拷贝方法

  1. Json.parse(Json.stringify(object))
let a = {
    name:'qqy',
    book:{
        title:"Yon don't know JS",
        price: '45'}
}
let b = JSON.parse(JSON.stringify(a));
a.name = 'lisi';
b.book.price = '22';
console.log(a);
console.log(b);
image.png
JSON.parse(JSON.stringify()的缺点)
  1. 手写实现
let obj = {
    name:'test',
    main:{
        a:1,
        b:2
    },
    fn:function(){

    },
    friends:[1,2,3,[22,33]]
}
function copy(obj){
    let newobj = null;
    if(typeof obj == 'object' || typeof obj == 'function' && obj !==null){
        newobj = obj instanceof Array? []:{};
        for(let i in obj){
            if(typeof obj[i] === 'object'){
                newobj[i] = copy(obj[i]);
            }else{
                newobj[i] = obj[i]
            }
        }
    }
    return newobj;
}
let obj2 = copy(obj)

最终无敌大杀器

function istype(obj,type){//判断包装类型的原型
    return Object.prototype.toString.call(obj).indexOf(type)!=-1
}
const deepClone =(initalObj) =>
    {
        if (typeof initalObj !== 'object') {//如果是基本类型直接返回值
            return initalObj
        }
        if(istype(initalObj,'String')||istype(initalObj,'Number')||istype(initalObj,'Boolean'))
            return initalObj.valueOf();
        if(istype(initalObj,'Date'))
            return new Date(initalObj.valueOf());
        if(istype(initalObj,'RegExp')){
            let pattern = initalObj.valueOf();
            let flags = '';
            flags += pattern.global ? 'g' : '';
            flags += pattern.ignoreCase ? 'i' : '';
            flags += pattern.multiline ? 'm' : '';
            return new RegExp(pattern, flags);
        }
        const obj = Array.isArray(initalObj)?[]:{};//可能是对象或者数组
        for (const key in initalObj) {
            if (typeof initalObj[key] === 'object') {//对于对象元素,deepclone
                //递归返回新的对象
                obj[key] = deepClone(initalObj[key]);
            } else if (typeof initalObj[key] === 'function') {//对于函数,用bind拷贝
                //返回新函数
                obj[key] = initalObj[key].bind(obj);
            } else {
                //基本类型直接返回
                obj[key] = initalObj[key];
            }
        }
        return obj;
    }

相关文章

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

  • 深浅拷贝

    先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;基本类型:Underfied Null...

  • 深浅拷贝

    浅拷贝是对一个对象的顶层拷贝。通俗的理解就是:拷贝了引用,并没有拷贝内容。 深拷贝是对于一个对象所有层次的拷贝(递...

  • 深浅拷贝

    深浅拷贝.copy 浅拷贝 这是一个方法,浅拷贝修改可变类型是会将原数据也一块修改 Copy.deepcopy 深...

  • 深浅拷贝

    1:is 和 ==的区别 is 是比较两个引用是否指向了同一个对象(地址引用比较)。== 是比较两个对象是否相等。...

  • 深浅拷贝

    函数的传递,与matlab不同,具有以下特点: 1.直接赋值会带来不同ID,例如,a=2,b=2 2.传递引用赋值...

  • 深浅拷贝

    最近一直被问到深浅拷贝的问题。自己也确实不太清楚怎么回事,现在来研究一下。 什么是深浅拷贝 浅拷贝:指针拷贝,不会...

  • 深浅拷贝

    概念: 浅复制:不拷贝对象本身,仅仅是拷贝指向对象的指针深复制:是直接拷贝整个对象内存到另一块内存中 注意:这里有...

网友评论

    本文标题:深浅拷贝

    本文链接:https://www.haomeiwen.com/subject/wbbvohtx.html