Проблема с Вашей мелкой копией - то, что все объекты не клонированы. В то время как ссылки на каждый объект уникальны в каждом массиве, как только Вы в конечном счете захватываете на него, Вы имеете дело с тем же объектом как прежде. Нет ничего неправильно со способом, которым Вы клонировали его... тот же результат произойдет с помощью Array.slice ().
причина Ваша глубокая копия имеет проблемы, то, потому что Вы заканчиваете с круговыми ссылками на объект. Глубоко пойдет настолько глубоко, как это может пойти, и если у Вас будет круг, то это будет продолжать идти бесконечно, пока браузер не ослабевает.
, Если структура данных не может быть представлена как направленный граф без петель, то я не уверен, что Вы собираетесь быть способными найти универсальный метод для глубокого клонирования. Циклические графики обеспечивают много хитрых угловых случаев, и так как это не общая операция, я сомневаюсь, что любой записал полное решение (если это даже возможно - это не могло бы быть! Но у меня нет времени пытаться записать строгое доказательство теперь.). Я нашел некоторые хорошие комментарии к проблеме о эта страница .
, Если Вам нужна глубокая копия Массива Объектов с циклическими ссылками, я полагаю, что Вы оказываетесь перед необходимостью кодировать свой собственный метод для обработки специализированной структуры данных, такой, что это - многопроходный клон:
Использование отражателя:
this.ResumeLayout() is equal to this.ResumeLayout(true)
Но
this.ResumeLayout(true) is not equal to this.ResumeLayout(false) + this.PerformLayout()
Причина:
Когда ResumeLayout вызывается со значением false, существует циклическая коллекция элементов управления, и LayoutEngine вызывает InitLayout для каждого элемента управления в макете.
SuspendLayout
При добавлении нескольких элементов управления в родительский контроль, рекомендуется вы вызываете метод SuspendLayout перед инициализацией элементов управления добавлен. После добавления элементов управления в родительский элемент управления, вызовите ResumeLayout метод. Это будет повысить производительность приложения с множеством элементов управления.
PerformLayout
Заставляет элемент управления применять макет логика для всех его дочерних элементов управления. Если метод SuspendLayout был позвонил, прежде чем позвонить PerformLayou t событие Layout подавляется. Событие макета можно подавить с помощью SuspendLayout и Методы ResumeLayout.
Ссылка MSDN - Метод PerformLayout