Javascript深拷贝

Category:
发表:

因为js中的对象可以无限嵌套,所以一般来说,给js的对象做深度拷贝不是一个好的主意。但是有时候,我们偏偏又有这种需求,下面简要介绍下如何在js中做深度拷贝。

看下面的代码,支持数组对象的深拷贝,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var deepClone = function(obj) {
if (typeof (obj) !== 'object') {
return obj;
}
var re = {};
if (obj.constructor === Array) {
re = [];
}
for ( var i in obj) {
// 过滤从上级原形继承的属性
if (obj.hasOwnProperty(i)) {
re[i] = deepClone(obj[i]);
}
}
return re;
}

上面是一种非常常规的深拷贝思路。除此之外,还有一种非常取巧的方式,

1
2
3
4
5
6
7
var a = {
// your property
};

var aStr =JSON.stringify(a);

var copy = JSON.parse(aStr);

a是一个符合json格式的对象时,上面是没有问题。

但是当a中出现Function类型的属性,或者不是标准的json数据,或者出现如下的形式:

1
2
3
var a = {
b: a
};

这些情况时,就得不到期望的结果了。