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] = obj[attr];
}
return copy;
}
throw new Error("Unsupported object type");
}
参考:http://*.com/questions/728360/most-elegant-way-to-clone-a-javascript-object。