【发布时间】:2017-03-10 13:45:42
【问题描述】:
我从 Dmitriy Pichugin 的 existing answer 复制了以下函数。这个函数可以在没有任何循环引用的情况下深度克隆一个对象——它可以工作。
function deepClone( obj ) {
if( !obj || true == obj ) //this also handles boolean as true and false
return obj;
var objType = typeof( obj );
if( "number" == objType || "string" == objType ) // add your immutables here
return obj;
var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor();
if( obj instanceof Map )
for( var key of obj.keys() )
result.set( key, deepClone( obj.get( key ) ) );
for( var key in obj )
if( obj.hasOwnProperty( key ) )
result[key] = deepClone( obj[ key ] );
return result;
}
但是,我的程序无限循环,我意识到这是由于循环引用造成的。
循环引用示例:
function A() {}
function B() {}
var a = new A();
var b = new B();
a.b = b;
b.a = a;
【问题讨论】:
-
你可以创建一个数组来存储每个“to-clone”对象的对象引用,并检查
.indexOf()是否存储在该列表中。 -
@MikeMcCaughan 啊,有趣!泰!它看起来非常有用,但不保留自定义类实例。
标签: javascript node.js clone circular-reference