…每个对象还引用了同一数组中的其他对象吗?
当我第一次想到这个问题时
var clonedNodesArray = nodesArray.clone()
将存在并搜索有关如何在javascript中克隆对象的信息。我确实在StackOverflow上发现了一个问题(由相同的@JohnResig回答),他指出,使用jQuery,您可以做到
var clonedNodesArray = jQuery.extend({}, nodesArray);
clone对象。我尝试了一下,但这只复制了数组中对象的引用。所以如果我
nodesArray[0].value = "red" clonedNodesArray[0].value = "green"
nodeArray [0]和clonedNodesArray [0]的值都将变为“绿色”。然后我尝试
var clonedNodesArray = jQuery.extend(true, {}, nodesArray);
它深深复制了一个对象,但是我分别从Firebug和Opera Dragonfly 得到了“ 太多的递归 ”和“ 控制堆栈溢出 ”消息。
你会怎么做?这是什至不应该做的事情吗?有没有一种可重用的方式来做到这一点在Javascript中?
浅表副本的问题是未clone所有对象。尽管每个对象的引用在每个数组中都是唯一的,但是一旦最终抓住它,您将像以前一样处理同一对象。clone它的方式没有错…使用Array.slice()会产生相同的结果。
您的深层副本有问题的原因是因为您最终得到了循环对象引用。Deep将尽可能深入,如果您有一个圆圈,它将无限循环直到浏览器晕倒为止。
如果数据结构不能表示为有向无环图,那么我不确定您是否能够找到用于深度clone的通用方法。循环图提供了许多棘手的极端情况,由于这不是常见的操作,我怀疑有人编写了完整的解决方案(如果可能的话-可能不是!但是我现在没有时间尝试编写严格的证明。)。在此页面上,我对此问题发表了一些好的评论。
如果您需要带有循环引用的对象数组的深层副本,我相信您将必须编写自己的方法来处理您的专用数据结构,例如多遍clone: