zoukankan      html  css  js  c++  java
  • js 深拷贝

    1.正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。
       

    var newObj=JSON.parse(JSON.stringify(obj));
    
    
    //也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。
    var obj1 = { fun: function(){ console.log(123) } };
    var obj2 = JSON.parse(JSON.stringify(obj1));
    console.log(typeof obj1.fun); // 'function'
    console.log(typeof obj2.fun); // 'undefined' <-- 没复制

    2.通过递归复制

    // 遍历对象 for(var i in obj)
    //1.判断是不是原始值 typeof() object
    //2.判断是数组还是对象 constructor instanceof toSting()
    //3.建立相应的数组或对象
    //4.递归
    function deepClone(origin,target){
        var target=target?target:(origin.constructor === Array) ? [] : {};
    
        for(var i in origin){
            // 判断对象是否包含特定的自身(非继承)属性。
            if(!origin.hasOwnProperty(i)) continue;
            // 避免相互引用对象导致死循环,如origin.a = origin的情况
            if(origin[i] === target)  continue; 
            // 防止为null
            if(origin[i]&&typeof origin[i]=='object'){
                target[i]=origin[i] instanceof Array?[]:{};
                arguments.callee(origin[i],target[i]);//表示函数体本身,解耦和
    
            }else{
                target[i]=origin[i];
            }
        }
        return target;
    }
    
      
    var arr=[{name:'su'},[1,2,3],{asd:null}];
    var newArr=deepClone(arr);
    newArr[0].name='su123';
    
    console.log(arr); //[{name:'su'},[1,2,3]]
    console.log(newArr);//[{name:'su123'},[1,2,3]]
    function deepClone(origin){
        var target=origin.constructor === Array ? [] : {};
        for(var i in origin){
            // 判断对象是否包含特定的自身(非继承)属性。
            if(!origin.hasOwnProperty(i)) continue;
            // 避免相互引用对象导致死循环,如origin.a = origin的情况
            if(origin[i] === target)  continue; 
            // 防止为null
            if(origin[i]&&typeof origin[i]=='object'){
                target[i]=arguments.callee(origin[i]);//表示函数体本身,解耦和
            }else{
                target[i]=origin[i];
            }
        }
        return target;
    }
     // 判断数组与对象的三种方法
        var obj=[]||{};
        // constructor instanceof 
        console.log(obj.constructor==Array);
        // A instanceof B :A对象是不是B构造函数构造出来的->看A对象的原型链上 有没有B的原型
        console.log(obj instanceof Array);
        console.log(Object.prototype.toString.call(obj)=='[object Array]');

     3. jquery

    var arr={name:'su',a:{b:'11'}};
    
    //用于将一个或多个对象的内容合并到目标对象 $.extend( [deep ], target, object1 [, objectN ] )
    var newArr=$.extend(true,{},arr); 
    
    newArr.a.b='su123';
    
    console.log(arr); //{name:'su',a:{b:'11'}}
    console.log(newArr);//{name:'su',a:{b:'su123'}}
  • 相关阅读:
    jQuery 间歇式无缝滚动特效分享(三张图片平行滚动)
    百度网页分享js代码
    如何在linux中搭建JEECMS系统
    Python菜鸟之路:Python基础-类(2)——成员、成员修饰符、异常及其他
    Python菜鸟之路:Python基础-类(1)——概念
    Python菜鸟之路:Python基础-生成器和迭代器、递归
    Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator
    Python菜鸟之路:Python基础-内置函数补充
    Python菜鸟之路:Python基础——函数
    Python菜鸟之路:Python基础(三)
  • 原文地址:https://www.cnblogs.com/yuesu/p/9290545.html
Copyright © 2011-2022 走看看