今天看博客发现了深拷贝的一种写法:
function clone(o){ var k, ret= o, b; if(o && ((b = (o instanceof Array)) || o instanceof Object)) { ret = b ? [] : {}; for(k in o){ if(o.hasOwnProperty(k)){ ret[k] = clone(o[k]); } } } return ret; }
发现上述代码拷贝一般对象时可以使用,但是如果对象属性有类似new Date()对象时,拷贝出来的结果就有问题了。
修改了一下方法:
function clone(obj){ if(!obj || typeof obj != 'object' || (obj.__proto__.constructor !== Object.prototype.constructor && obj.__proto__.constructor !== Array.prototype.constructor)) return obj instanceof Date ? new Date(obj) : obj; var result = {}; if(obj instanceof Array) result = []; for(var i in obj){ if(obj.hasOwnProoerty(i) result[i] = clone(obj[i]); } return result; }
当然__proto__属性在ie下行不通,可列举类似Date、String等类型加以判断。
还让大神指正!
我是胡说八道的:-D