JS中如何深拷贝

 方法1.我们可以利用js自带的方法JSON利用其中的原理将原数据深拷贝转成一个新的数据

 JSON.stringify()  将真正的对象和数组转成字符串    JSON.parse()

 

 // 数组
        var arr1 = ["a","b","c",["1","2","3"]];
        var arr2 = JSON.stringify(arr1);
        arr2 = JSON.parse(arr2);
        arr2[3][0] = "9";
        console.log(arr2);// ["a","b","c",[9 2 3]]
        console.log(arr1);// ["a","b","c",[1 2 3]]

方法2.使用jQuery自带的方法

 var arr1 = ["a","b","c",["1","2","3"]];
        var arr2 = $.extend(true,[],arr1);
        arr2[3][0] = "999";
        console.log(arr2);//['a', 'b', 'c', ['999', '2', '3']]
        console.log(arr1);//['a', 'b', 'c', ['1', '2', '3']]

方法3 写一个原生js深拷贝

            封装的时候我们不确定传入进来的复杂数据时Array还是Object类型

            typeof 无法判断具体的数据类型

            instanceof 也无法具体判断数据类型

            我们用Object.prototype.toString.call(当前数据).slice(8,-1)

            利用对象构造函数中原型属性tostring让它的this指向我的当前数据.

            不嫌麻烦可以截取一下对应的字符串

           

      

function getDateType(date){
            return Object.prototype.toString.call(date).slice(8,-1);
        }

深拷贝原生写法

function deepDateObj(dateObj){
            if(getDateType(dateObj) == "Array"){
                var obj = [];
            }else if(getDateType(dateObj) == "Object"){
                var obj = {};
            }else{
                return dateObj;
            }

            for(var key in dateObj){
                if(getDateType(dateObj[key]) == "Array" || getDateType(dateObj[key]) == "Object"){
                  // 如果再次遇到复杂数据类型,就将当前函数内的方法再走一次
                  // 把返回的新结果给到之前的位置
                   obj[key] = deepDateObj(dateObj[key]);
                }else{
                    obj[key] = dateObj[key];
                }
            }
            return obj;
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值