javascript深拷贝

来源:互联网 发布:11年总决赛数据 编辑:程序博客网 时间:2024/05/21 17:46

javascript的浅拷贝和深拷贝是老生长谈的问题了。浅拷贝是内存引用,修改一个会引起另一个跟着改变,当然只对object类型生效。今天看到一个深拷贝的方法:

var cloneObj = function(obj){    var str, newobj = obj.constructor === Array ? [] : {};    if(typeof obj !== 'object'){        return;    } else if(window.JSON){        str = JSON.stringify(obj), //系列化对象        newobj = JSON.parse(str); //还原    } else {        for(var i in obj){            newobj[i] = typeof obj[i] === 'object' ?             cloneObj(obj[i]) : obj[i];         }    }    return newobj;};
深拷贝一般有两种方式:一种是新建一个对象,然后循环赋予属性和值,另外一种呢,利用JSON的stringify和parse方法实现。

迭代一个object的属性值,可以用for in 循环,更好的方法是用Object.keys()方法。Object.keys方法返回一个对象可枚举的属性名的数组。它与for in循环的不同之处在于,for in会把_proto_里的属性名也迭代进去。所以,for in循环里包含了hasOwnProperty为false的属性名。来看个例子

var Obj = function(){  this.a=1;}Obj.prototype.b=2;var newObj = new Obj();console.log(Object.keys(newObj)); //['a']for(var i in newObj){  console.log(i); // a,b  if (newObj.hasOwnProperty(i)){    console.log(i); // a  }}
另个附一个各种深拷贝的性能测试地址:https://jsperf.com/deep-copy-vs-json-stringify-json-parse/5#
0 0
原创粉丝点击