`

解决js对象的深度clone导致的递归死循环

阅读更多
  • 问题描述:

js对象clone是RIA编程中常用方法,但是对象属性之间的循环引用会导致clone的递归进入死循环。

js 代码
 
  1. var  a = {pa1:'av1',pa2:'av2'};  
  2. var  b = {pb1:'bv1',pb2:'bv2'};  
  3. a.pa3 = b;  
  4. //b.pb3 = a;   
  5. 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也是适用的

分享到:
评论
1 楼 hotoo 2008-08-14  
用下载的代码弹出:Stack overflow at line: 15

相关推荐

    clone 深度克隆对象

    特别是在多线程环境下,深度克隆可以避免因共享对象导致的并发问题。 总结一下,深度克隆是复制复杂对象时确保数据独立性和安全性的有效手段。虽然它的效率可能不如直接new一个新的对象,但在需要保护原始数据不被...

    git-fastclone, 关于类固醇,git clone 递归.zip

    git-fastclone, 关于类固醇,git clone 递归 fastclone git fastclone是类固醇的git clone --recursive 。为什么 fastclone?在特定机器上进行大量重复签出?知识库 1st Fastclone 2nd Fastc

    C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf

    C# 中 Clone 一个对象的值到另一个对象案例 C# 中 Clone 一个对象的值到另一个对象案例是一种常见的编程需求。在这篇文章中,我们将学习如何使用 C# 中的 Clone 方法来复制一个对象的值到另一个对象。 什么是 ...

    Javascript对象Clone实例分析

    在讨论JavaScript对象克隆的实现与技巧时,我们首先需要了解对象克隆的概念和它在编程中的应用。对象克隆指的是创建一个具有与原始对象相同属性和值的新对象,但两个对象是独立的,即对新对象的任何修改都不会影响...

    深入理解JavaScript中的对象复制(Object Clone)

    递归函数则需要确保所有嵌套的对象都能被正确处理,且需要处理循环引用等复杂情况,否则可能会导致栈溢出错误。 在使用自定义的clone方法时,还需要对一些特殊类型进行处理,例如日期(Date)、数组(Array)和普通...

    Java利用序列化实现对象深度clone的方法

    此外,序列化有一定的性能开销,因此在不需要深度克隆或者对象不包含大量数据的情况下,可能更适合使用浅克隆(`Object.clone()`)或者其他克隆策略。对于大型复杂对象,可以考虑使用更高效的库,如Apache Commons ...

    javascript中clone对象详解.docx

    首先,我们可以使用`JSON.parse()`和`JSON.stringify()`这对组合来克隆简单对象,但这并不适用于包含函数或循环引用的对象,因为它们在序列化过程中会被忽略或导致错误。 为了实现更灵活和深入的克隆,我们可以编写...

    jlink v9 warning clone解决

    标题中的"jlink v9 warning clone解决"意味着开发者正在尝试解决关于JLink v9版本出现的克隆警告。这个警告可能是因为使用了非官方的或者未授权的JLink设备,或者是由于驱动程序或固件版本不兼容导致的。在MDK环境下...

    JS对象的深度克隆方法示例

    虽然这种方法简单,但它不能处理所有类型的JavaScript对象。例如,日期对象、正则表达式、函数、`undefined`值等将丢失或转换为其他值。 在提供的示例中,这两种方法都被用来创建`schedule`对象的深副本,并在副本...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    在Java编程语言中,`clone()`方法是一个非常重要的概念,特别是在处理对象复制和数据持久化时。本示例将深入探讨`clone()`方法的工作原理、使用场景以及如何在实际编程中应用。首先,我们来理解一下`clone()`方法的...

    java Clone

    Java中的`clone`方法是Java语言提供的一种复制对象的方式,它允许创建一个对象的副本,这个副本与原对象具有相同的属性值,但它们是两个独立的对象,修改副本不会影响原对象。`clone`方法存在于Java的`java.lang....

    PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析

    本文实例讲述了PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法。分享给大家供大家参考,具体如下: 1.对象克隆 clone PHP4面向对象功能一个很大的缺点,是将对象视为另一种数据类型,这使得很多常见的...

    对象克隆(clone)详解.docx

    如果一个对象包含对可变(非静态)对象的引用,深克隆会递归地克隆这些内部对象,确保新对象内部的引用指向新的、独立的对象副本。如果对象只包含基本类型或对静态对象的引用,那么通常不需要进行深克隆。 示例代码...

    深化理解JavaScript中的对象复制(Object Clone)_.docx

    在JavaScript中,对象复制,也称为克隆,是一项关键的编程技巧,用于创建一个对象的新副本,而不会改变原始对象。JavaScript的浅复制和深复制是两个重要的概念,它们在处理复杂数据结构时尤为关键。 浅复制...

    Jlink-clone解决办法,替换文件.rar

    本文将深入探讨如何解决Jlink-clone带来的问题,并提供一种可能的解决方案——替换文件。 首先,理解问题的本质至关重要。Jlink-clone可能存在的问题包括固件不完整、软件兼容性差、速度慢、不稳定或者丢失某些服务...

    彻底解决Mac端git clone/push速度太慢的问题

    彻底解决Mac端git clone/push速度太慢的问题,详情请参阅文档。

    gitlab-group-clone:递归克隆整个gitlab组树的工具

    您可以通过安装“ 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 --...

Global site tag (gtag.js) - Google Analytics