对象的深复制与浅复制

对象里面可以包含变量=值,变量=数组,变量=对象;

即:
对象 ={

    变量=值,

    变量=数组,、

    变量=对象

}

在对对象进行复制的时候,如果直接复制对象不经过任何处理,那么对变量中对应的对象和数组,由于其变量只是存储着指向对象或者数组在堆中的值,那么我们只是复制指向对象和数组的指针,于是对于复制出来的副本,我们对副本中的变量所对应的数组和对象所做的任何都将会影响到被复制对象的本身,这就是所谓的浅复制;而相反如果我们对于对象进行处理,使到我们复制的是数组和对象所指向的值而非指向该对象和数组的指针,而且我们对这个副本所做的任何的改变都不会影响到原对象,那么就是所说深复制。

下面是转载的代码转自:http://www.cnblogs.com/rubylouvre/archive/2010/03/26/1696600.html

关于浅复制的代码:

View Code
 1  

 2 <!doctype html>

 3 <html lang="en">

 4   <head>

 5     <meta charset="utf-8" />

 6     <meta content="IE=8" http-equiv="X-UA-Compatible"/>

 7     <title>javascript 深拷贝 by 司徒正美 </title>

 8 

 9     <script type="text/javascript">

10       var oOriginal = {

11         memNum: 1,                                    // number

12         memStr: "I am a string",                      // string

13         memObj: {

14           test1: "Old value"                          // we’ll test

15         },

16         memArr: [                                     // array 

17           "a string",                                 // string member of array

18           {                                           // object member of array

19             test2: "Try changing me"          // we'll test

20           }

21         ]

22       };

23       var extend = function(result, source) {

24         for (var key in source)

25           result[key] = source[key];

26         return result;

27       }

28       var oCopy = extend({},oOriginal);                     // 浅拷贝

29       oCopy.memObj.test1 = "New value";                     // 出现问题了,会反射到原对象上

30       alert(oOriginal.memObj.test1);                        // 结果副本与原本都一同被修改了

31       oCopy.memArr[1].test2 = "I am changed";              

32       alert(oOriginal.memArr[1].test2);                      // 同样中招了

33     </script>

34 

35   </head>

36   <body>

37     <h1>javascript 深拷贝 by 司徒正美</h1>

38   </body>

39 </html>

 

关于深复制的代码:

View Code
 

<!doctype html>

<html lang="en">

  <head>

    <meta charset="utf-8" />

    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>javascript 深拷贝 by 司徒正美 </title>



    <script type="text/javascript">

      var oOriginal = {

        memNum: 1,                                    // number

        memStr: "I am a string",                      // string

        memObj: {

          test1: "Old value"                          // we’ll test

        },

        memArr: [                                     // array 

          "a string",                                 // string member of array

          {                                              // object member of array

            test2: "Try changing me"           // we'll test

          }

        ]

      };

      dom = {};

      dom.is = function (obj,type) {

        var toString = Object.prototype.toString,undefined;

        return (type === "Null" && obj === null) ||

          (type === "Undefined" && obj === undefined ) ||

          toString.call(obj).slice(8,-1) === type;

      };



      dom.deepCopy = function(result, source){

        for(var key in source) {

          var copy = source[key];

          if(source === copy) continue;//如window.window === window,会陷入死循环

          if(dom.is(copy,"Object")){

            result[key] = arguments.callee(result[key] || {}, copy);

          }else if(dom.is(copy,"Array")){

            result[key] = arguments.callee(result[key] || [], copy);

          }else{

            result[key] = copy;

          }

        }

        return result;

      };

      var oCopy = dom.deepCopy({},oOriginal);                     // 浅拷贝

      oCopy.memObj.test1 = "New value";                   // 出现问题了,会反射到原对象上

      alert(oOriginal.memObj.test1);                         // 结果副本与原本都一同被修改了

      oCopy.memArr[1].test2 = "I am changed";              

      alert(oOriginal.memArr[1].test2);                      // 同样中招了

    </script>



  </head>

  <body>

    <h1>javascript 深拷贝 by 司徒正美</h1>

  </body>

</html>

以后来点自己写的·····

你可能感兴趣的:(对象)