关于深拷贝和浅拷贝

简单来说
对象的浅拷贝就是一个改变的时候另一个也改变 ,它只拷贝一层对象的属性
对象的深拷贝就是一个改变的时候另一个不改变,两个对象对应两个不同的地址
先写写浅拷贝:

		var obj1={
     "name":"gao"};
        var obj2 = obj1;
            obj1.name ="wang";

        console.log("obj1",obj1);
        console.log("obj2",obj2);

关于深拷贝和浅拷贝_第1张图片
可以看到obj1和obj2是一样的 同时更改obj1的时候obj2也是会跟着改变的,因为它们只拷贝了对象的属性

再写写深拷贝:
深拷贝的写法有很多,最基础的就是下面这种

		var obj3 ={
     "age":18};

        var obj4={
     };
            obj4.age = obj3.age;
            obj3.age=99999;

            console.log("obj3",obj3)
            console.log("obj4",obj4);

关于深拷贝和浅拷贝_第2张图片
这时候就可以看到,在更改obj3的时候,obj4并没有变化,这就是最简单的深拷贝。
当然深拷贝还有其他的写法,比如——递归的方法

		var obj={
     
            "name":"gao",
            "age":18,
            "list":{
     
                "title":"新闻"
            }
        }
        obj.__proto__.say=function(){
     };


        // 深拷贝函数 --     创建 新对象 循环赋值 
        // 如果属性值 是对象  创建 新对象 循环赋值 
        
        function deepCopy(obj){
     
            var copyObj={
     };

            for(var key in obj){
     
                if(obj.hasOwnProperty(key) == true ){
     

                    if(obj[key] instanceof Object ){
     

                        copyObj[key]= deepCopy(obj[key])
                    }else{
     
                        copyObj[key]=obj[key]
                    }
                }
            }


            return copyObj;
        }


        var o2= deepCopy(obj)

        obj.list.title="娱乐"
        console.log(obj);
        console.log(o2);

还有转字符串的方法

		var obj={
     
                    "name":"gao",
                    "age":18,
                    "list":{
     
                        "title":{
     
                            "a":"b"
                        }
                    },
                    "run":function(){
     

                    }
                }
        obj.__proto__.say=function(){
     };

        // JSON.stringify 没有原型链 
        var obj2 =  JSON.parse( JSON.stringify(obj) );

            obj.name ="wang";
            obj.age ="wang";
            obj.list.title.a ="ssss";


            console.log(obj);
            console.log(obj2);

你可能感兴趣的:(js,javascript,html5,jquery)