JavaScript学习笔记(十四)——深拷贝

深拷贝

先来理解一下什么是深拷贝:就是复制出一个新的对象,不能修改它所拥有的全部数据,包括数据类型,但是绝对不能相等,也就是说==为false。

第一种情况:如果内部没有引用数据,或者时间正则null等等数据时。

如果我创建了一个对象obj1,这个时候我要拷贝一份obj1里面的内容以保证我修改obj2内容时,obj1对象不受影响,也就是说在内存中重新申请一个空间。

        var obj1 = {
            name: 'karen'
        }
        
        //这种方法不推荐使用,因为还要去看obj1里面的成员,多了无法实现
        // var obj2 = {};
        // obj2.name = obj1.name;

		//巧妙利用JSON字符串的转换完成拷贝
        var str = JSON.stringify(obj1);
        var obj2 = JSON.parse(str);


		//检测是否是同一个对象
        console.log(obj1 == obj2);
        //false

第二种情况(笔试频率特别高和垂直水平居中差不多):

例如:拷贝事件对象

var dt = new Date();
var dt2 = JSON.parse(JSON.stringify(dt));
 console.log(typeof dt2);//打印出来的不是date而是string

如果拷贝事件对象的话,用我们前面的方法来拷贝就会出现错误,拷贝过去的不是事件对象,而是字符串,所以我们要学习更高级的拷贝方法:

自己封装一个函数(背下来):

方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝;

var copy1 = function (obj) {
    return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",e:new Date(),f:null,g:undefined}
var b = copy1(a)

方法2.利用自调用;

       var obj = {
            o1: 'hello',
            o2: [1, 23, [3, 2]],
            o3: null
        };
        var copy1 = function (obj) {
            if (obj === null) return null
            if (typeof obj !== 'object') return obj;
            if (obj.constructor === Date) return new Date(obj);
            if (obj.constructor === RegExp) return new RegExp(obj);
            var newObj = new obj.constructor(); //保持继承链
            for (var key in obj) {//这里可以用object.key(obj)
                if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
                    var val = obj[key];
                    newObj[key] = typeof val === 'object' ? arguments.callee(val) :
                        val; // 使用arguments.callee解除与函数名的耦合
                }
            }
            return newObj;
        };
        var obj2 = copy1(obj);
        console.log(obj2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值