function clone(obj) if (null == obj || "object" != typeof obj) return obj; var copy = obj.constructor(); for (var attr in obj) if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; } return copy;}var d1 = new Date();/* Executes function after 5 seconds. */setTimeout(function(){ var d2 = clone(d一、 alert("d1 = " d1.toString() "\nd2 = " d2.toString(),5000)code]日期字符串d1将比 日期字符串晚 5 秒d2.一一个Date同样的方法是调用它setTime但这是特定的Date类别。我认为没有万无一失的通用解决方案,尽管我愿意犯错误!9 { E) Y! }3 f
当我不得不实现一般的深度复制时,我终于妥协了,假设我只需要复制一个普通的Object,Array,Date,String,Number,或Boolean. 最后 3 的类型是不可改变的,所以我可以执行浅拷贝而不用担心它会改变。我进一步假设它包含在内Object或Array也将是列表中 6 简单类型之一的任何元素。这可以通过以下代码来完成:) h+ q: N5 Q$ o( d; n4 C v
[code]function clone(obj) var copy; // Handle the 3 simple types,and null or undefined if (null == obj || "object" != typeof obj) return obj; // Handle Date if (obj instanceof Date) copy = new Date();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;copy.setTime(obj.getTime();;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;return copy; } // Handle Array if (obj instanceof Array) copy = for (var i = 0,len = obj.length; i 只要对象和数组中的数据形成树结构,上述函数就可以完全适用于我提到的 6 简单类型。换句话说,对象中不超过一个引用相同数据。[code]// This would be cloneable:var tree = "left" : "left" : null,"right" : null,"data" "right" : null, "data" : 8}This would kind-of work,but you would get 2 copies of the // inner node instead of 2 references to the same copyvar directedAcylicGraph = "left" : "left" : null,"right" : null,"data" "data" : 8};directedAcyclicGraph["right"] = directedAcyclicGraph["left"];// Cloning this would cause a stack overflow due to infinite recursion:var cyclicGraph = "left" : "left" : null,"right" : null,"data" "data" : 8};cyclicGraph["right"] = cyclicGraph;3 u' W# i6 \7 a) q8 T( g# t