对象浅拷贝深拷贝方法总结

19 篇文章 0 订阅
1 篇文章 0 订阅
对象复制方法总结
Object.assignObject.creat() jQuery.extend(object)
JSON.parse(JSON.stringfy())循环递归方法 原型链继承方法

深拷贝是拷贝储存在栈中的对象,
而浅拷贝是从内存中拷贝,
数据大体可以分为两种数据类型,
一种是基本数据类型,数据结构不是很复杂,单独可以存在内存中就可以,
另一种是复杂数据类型,也叫引用数据类型,放在栈中存储的,例如数组和对象

引用类型数据存储是首先在内存开辟一个空间,但内存当中不可以存储这种复杂数据类型,
所以要把这种结构放到栈当中,栈相当于一个密码箱,而钥匙存在内存当中,这就构成了一个存储关系,

浅拷贝就是把这份钥匙复制了一份,但内存当中的数据并没有复制,所以如果改变a相应b也会改变
而深拷贝则需要在栈中在生成一个密码箱,生成一把新钥匙(钥匙2),这样深拷贝的两种数值不会相互影响,
也可以说没有任何关系了

方法一:JSON.parse(JSON.stringify(obj));
但是这种简单粗暴的方法有其局限性。当值为undefined、function、symbol 、有NaN、Infinity和-Infinity、RegExp、Error对象,时间对象,会在转换过程中被忽略或者异常

JSON.parse(JSON.stringfy())注意事项

方法二、递归通用拷贝函数

function deepCopy(obj) {
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
 
    if (obj instanceof Date) {
        return new Date(obj.getTime());
    }
 
    if (Array.isArray(obj)) {
        return obj.reduce((arr, item, i) => {
            arr[i] = deepCopy(item);
            return arr;
        }, []);
    }
    if (typeof obj === 'object') {
        return Object.keys(obj).reduce((newObj, key) => {
            newObj[key] = deepCopy(obj[key]);
            return newObj;
        }, {});
    }
}

方法三、Object.assign({},obj)

var obj = {a:1,b:2}  
var newObj = Object.assign({}, obj); 

在这里插入图片描述

方法四、jq中,$.extend({},obj)方法、jQuery.extend(object)方法
概述:
 扩展jQuery对象本身,用来在jQuery命名空间上增加新函数。

var obj = {
    x: 1,
    y: {
        a: 1,
        b: 0,
        c: [1, 2, 3]
    }
};
var obj2 = $.extend({}, obj);
console.log(obj2 === obj) //false 
console.log(obj2);

在这里插入图片描述
方法五. Object.create()方法
 复制对象存在于Object原型prototype中

var obj = {
    x: 1,
    y: {
        a: 1,
        b: 0,
        c: [1, 2, 3]
    }
};

var obj2 = Object.create(obj);
console.log(obj2 == obj); //false
console.log(obj2);

在这里插入图片描述
 深拷贝, 就是遍历那个被拷贝的对象。判断对象里每一项的数据类型。如果不是对象类型, 就直接赋值, 如果是对象类型, 就再次调用递归的方法去赋值。

方法六. 原型链继承方法

function Father() {
    this.say = "hi";
    this.fn = function () {
        return this.say;
    }
}
Father.prototype.eat = function () {
    console.log('吃');
}
function Son() {
    this.play = function () {
        console.log('play game');
    }
}

//通过原型来继承父类的公共属性

Son.prototype = new Father();
var s = new Son();
console.log(s);
console.log(s.say); //hi
console.log(s.fn()); //hi

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值