Javascript中的深拷贝

1. 第一种实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function copy (obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
var copyObj,
_toString = Object.prototype.toString;

if (_toString.call(obj) === '[object Object]') {
copyObj = {};
} else if (_toString.call(obj) === '[object Array]') {
copyObj = [];
}

for (var name in obj) {
copyObj[name] = copy(obj[name]);
}
return copyObj;
}

主要思路就是通过层层递归调用。

2. 第二种实现方法

1
2
3
4
5
6
7
8
9
10
function copy (obj) {
var copyObj = Object.create(Object.getPrototypeOf(obj));
var propNames = Object.getOwnPropertyNames(obj);

propNames.forEach(function (name) {
var desc = Object.getOwnPropertyDescriptor(obj, name);
Object.defineProperty(copyObj, name, desc);
});
return copyObj;
}

主要是通过原生对象的关键方法实现。