JavaScrip对象的深层拷贝

      JavaScript语言并没有提供对象深层拷贝的方法,但是有时候我们确需要这项功能。下面就结合JavaScritp对象的类型来讨论一下如何进行JavaScript对象的深层拷贝。

    先说一下JavaScritp对象的类型。

var numValue = 1.9,
boolValue = true,
strValue = "asdfasdf",
dateValue = new Date(),
arrValue = [1, 2],
funcValue = function() {},
objValue = new Object();

var types = typeof number + "\n" + // number
typeof boolValue + "\n" +               // boolean
typeof strValue + "\n" +                 // string
typeof dateValue + "\n" +               // object (Date)
typeof arrValue + "\n" +                 // object (Array)
typeof funcValue + "\n" +               // function
typeof objValue;                            // object 

 

接下来我们设计一个函数clone(obj)

function clone(obj) {

}

对于简单值数据类型我们可以直接返回其值。

function clone(obj) {

if (obj == null || typeof obj != "object")         return obj;

....

}

对于类型为object的对象则没有那么容易和直接。我们没有必要也不能逐一遍历对象的属性来执行拷贝操作。

function clone(obj) {

  if (obj == null || typeof obj != "object")         return obj;

  var copyObj = obj.constructor();

  for(var attr in obj) {

    if (obj.hasOwnProperty(attr)) copyObj[attr] = obj[attr];

  }

  return copyObj;

}

其中对于Date,Array 我们需要单独处理:

function clone(obj) {

  if (obj == null || typeof obj != "object")         return obj;

  if (obj instanceof Date) {

    var copy = new Date();

    copy.setTime(obj.getTime());

           return copy;  

  }

    if (obj instanceof Array) {

    var copy = [];

    for( var i = 0, len = obj.length; i < len; i++) {

      copy[i] = clone(obj[i]);

    }

    return copy;

  }

  if (obj instanceof Object) {

    var copy = {};

        for(var attr in obj) {

          if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);

        }

        return copy;

  }

  throw new Error("Unsupported object type");  

}

参考:http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object。

 

posted @ 2014-04-02 00:20  临风远望  阅读(214)  评论(0编辑  收藏  举报