- 问题描述:
js对象clone是RIA编程中常用方法,但是对象属性之间的循环引用会导致clone的递归进入死循环。
js 代码
- var a = {pa1:'av1',pa2:'av2'};
- var b = {pb1:'bv1',pb2:'bv2'};
- a.pa3 = b;
- //b.pb3 = a;
- var c = cloneobj(a);
如果不包含注释掉的一行,clone是可以正常进行的。
但是如果引入这一行,即出现了js对象属性的循环引用,clone将进入递归的死循环。
- 现象
浏览器能够很好的处理这种错误,并抛出“too much recursion"错误,并定位到相应的代码行。
(小声说一句:如果写个js死循环就把浏览器搞死了,B/S应用就没法混了)
- 办法
如何解决了,通常的办法就是限制递归的深度,例如DWR的‘DWRUtil.toDescriptiveString’
但是窃以为这个并非好的解决办法,因为了对应用造成极大的限制。
我的办法就是,在clone的过程中,记住每个已经clone的对象属性,
并且在对对象进行深度clone之前,首先检查是否已经clone过了,如果是,则返回已clone的引用即可。
因此只要放开示例代码的注释行" // return os[m];"
就OK了。
- 说明
为了简化clone实现代码,引用并部分修改了DWR的工具类,见附件util.js
同样的解决思路对于java对象的深度clone也是适用的
相关推荐
特别是在多线程环境下,深度克隆可以避免因共享对象导致的并发问题。 总结一下,深度克隆是复制复杂对象时确保数据独立性和安全性的有效手段。虽然它的效率可能不如直接new一个新的对象,但在需要保护原始数据不被...
git-fastclone, 关于类固醇,git clone 递归 fastclone git fastclone是类固醇的git clone --recursive 。为什么 fastclone?在特定机器上进行大量重复签出?知识库 1st Fastclone 2nd Fastc
C# 中 Clone 一个对象的值到另一个对象案例 C# 中 Clone 一个对象的值到另一个对象案例是一种常见的编程需求。在这篇文章中,我们将学习如何使用 C# 中的 Clone 方法来复制一个对象的值到另一个对象。 什么是 ...
在讨论JavaScript对象克隆的实现与技巧时,我们首先需要了解对象克隆的概念和它在编程中的应用。对象克隆指的是创建一个具有与原始对象相同属性和值的新对象,但两个对象是独立的,即对新对象的任何修改都不会影响...
递归函数则需要确保所有嵌套的对象都能被正确处理,且需要处理循环引用等复杂情况,否则可能会导致栈溢出错误。 在使用自定义的clone方法时,还需要对一些特殊类型进行处理,例如日期(Date)、数组(Array)和普通...
此外,序列化有一定的性能开销,因此在不需要深度克隆或者对象不包含大量数据的情况下,可能更适合使用浅克隆(`Object.clone()`)或者其他克隆策略。对于大型复杂对象,可以考虑使用更高效的库,如Apache Commons ...
首先,我们可以使用`JSON.parse()`和`JSON.stringify()`这对组合来克隆简单对象,但这并不适用于包含函数或循环引用的对象,因为它们在序列化过程中会被忽略或导致错误。 为了实现更灵活和深入的克隆,我们可以编写...
标题中的"jlink v9 warning clone解决"意味着开发者正在尝试解决关于JLink v9版本出现的克隆警告。这个警告可能是因为使用了非官方的或者未授权的JLink设备,或者是由于驱动程序或固件版本不兼容导致的。在MDK环境下...
虽然这种方法简单,但它不能处理所有类型的JavaScript对象。例如,日期对象、正则表达式、函数、`undefined`值等将丢失或转换为其他值。 在提供的示例中,这两种方法都被用来创建`schedule`对象的深副本,并在副本...
在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和数据持久化时。本示例将深入探讨`clone()`方法的工作原理、使用场景以及如何在实际编程中应用。首先,我们来理解一下`clone()`方法的...
Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....
本文实例讲述了PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法。分享给大家供大家参考,具体如下: 1.对象克隆 clone PHP4面向对象功能一个很大的缺点,是将对象视为另一种数据类型,这使得很多常见的...
如果一个对象包含对可变(非静态)对象的引用,深克隆会递归地克隆这些内部对象,确保新对象内部的引用指向新的、独立的对象副本。如果对象只包含基本类型或对静态对象的引用,那么通常不需要进行深克隆。 示例代码...
在JavaScript中,对象复制,也称为克隆,是一项关键的编程技巧,用于创建一个对象的新副本,而不会改变原始对象。JavaScript的浅复制和深复制是两个重要的概念,它们在处理复杂数据结构时尤为关键。 浅复制...
本文将深入探讨如何解决Jlink-clone带来的问题,并提供一种可能的解决方案——替换文件。 首先,理解问题的本质至关重要。Jlink-clone可能存在的问题包括固件不完整、软件兼容性差、速度慢、不稳定或者丢失某些服务...
彻底解决Mac端git clone/push速度太慢的问题,详情请参阅文档。
您可以通过安装“ gitlab-clone”: $ pip install gitlab-clone 用法 >>> gitlab - clone: optional arguments: -h, --help show this help message and exit --group_id group_id Id of a group in gitlab --...