网上流传的js对象克隆实现函数的坑

发布于
网上随便一搜js Object克隆,看到最多的是下图这样的,这个clone函数没有经过仔细的测试,使用的时候会有很多的坑,不小心看到了,所以打算写篇文章来解剖一下。

整理一下,是下面这样的:
//这份是网上随便一找的,是有坑的
function clone(myObj) {
if (typeof (myObj) != 'object') return myObj;
if (myObj == null) return myObj;
var myNewObj = new Object();
for (var i in myObj)
myNewObj[i] = clone(myObj[i]);
return myNewObj;
}很明显,克隆的时候再处理数组的时候是一处坑,做一个实验可以很明显的显示出来:

变量a是一个数组,变量b是通过调用clone函数克隆的a,之后打印b,b是一个对象,而不是一个数组,a是有length属性的,b是没有length属性的,用instanceof判断b,b也不是Array的实例。
于是,我们来改进一下吧:
//改进之后的
function clone(myObj) {
if (typeof (myObj) != 'object') return myObj;
if (myObj == null) return myObj;
var myNewObj;
if (myObj.constructor) {
myNewObj = new myObj.constructor();
} else
myNewObj = {}
for (var i in myObj)
myNewObj[i] = clone(myObj[i]);
return myNewObj;
}测试一:

数组测试没问题
我们来点复杂一点的

这个也没问题。
OK!我也是几分钟改进,几分钟测试验证,不敢保证绝对的好,不过至少比网上流传的那份好,有瑕疵的地方欢迎大家留言指正!
或 匿名发表评论
找到 0 条评论