JS中如何进行对象的深拷贝

JavaScript027

JS中如何进行对象的深拷贝,第1张

//拷贝数据,深拷贝数据,绝对不会出现对象与数组引用相同位置

var copyData = function(item) {

if(item == null) {

return null

}

if($.isArray(item)) {

var newArray = []

for(var i=0i<item.lengthi++) {

newArray.push(copyData(item[i]))

}

return newArray

}

if($.isPlainObject(item)) {

var newObj = {}

for(var p in item) {

newObj[p] = copyData(item[p])

}

return newObj

}

return item

}

有效的对象拷贝应该是指深拷贝。

浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!

深拷贝:就是重新复制一块内存,这样就不会互相影响。

有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。

这个时候我们会用到深拷贝。

深拷贝的方法:

var deepCopy = function(source)

{

var result

(source instanceof Array) ? (result = []) : (result = {})

for (var key in source) {

result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key]

}    

return result  

}

如果是使用了  JQ  EXTJS 的话本身就有 对象克隆的 函数库可以使用  如 extjs 使用

ext.ux.util.clone()

没有用这些的话 可以自己写一个 克隆函数  网上有资源  比如

function deepClone(obj){    var result={},oClass=isClass(obj)

    // if(oClass==="Object"){

    //     result={}

    // }else if(oClass==="Array"){

    //     result=[]

    // }else{

    //     return obj

    // }

    for(key in obj){

        var copy=obj[key]

        if(isClass(copy)=="Object"){

            result[key]=arguments.callee(copy)

        }else if(isClass(copy)=="Array"){

            result[key]=arguments.callee(copy)

        }else{

            result[key]=obj[key]

        }

    }

    return result

}

function isClass(o){

    if(o===null) return "Null"

    if(o===undefined) return "Undefined"

    return Object.prototype.toString.call(o).slice(8,-1)

}

或者参考 extjs 的方法

 function(o) {  

   if(!o || 'object' !== typeof o) {        return o    }   

    if('function' === typeof o.clone) {        return o.clone()    }   

     var c = '[object array]' === object.prototype.tostring.call(o) ? [] : {}

     var p, v    

     for(p in o) {       

      if(o.hasownproperty(p)) {            v = o[p]           

      if(v && 'object' === typeof v) {               

       c[p] = ext.ux.util.clone(v)          

         }     else {          

               c[p] = v          

           }        

           }   

            }  

        return c}