【问题标题】:Is jQuery.extend safe from circular reference?jQuery.extend 对循环引用安全吗?
【发布时间】:2011-12-02 11:22:46
【问题描述】:

jQuery.extendcircular reference 安全吗?

如何避免 Javascript 中的循环引用(在克隆或递归检查时)?仅在其属性列表中检查当前目标的存在是不够的,因为它可能引用了一些外部对象。

一个选项是保留另一个列表,其中包含到目前为止提取的所有objects。但这会增加内存消耗并要求停止脚本吗?

我不想在工作线程中移动克隆操作。

【问题讨论】:

  • 根据对象的大小,JSON.stringiying它并检查它是否失败呢?如果对象包含圆形结构,JSON.stringify 将失败,并且(至少在 Chrome 上)您可以使用try catch 很好地捕捉到这种特定情况。
  • 您不需要检查循环引用。除非您对它们进行字符串化,否则它们会被很好地处理,在这种情况下它们将不包括循环引用。
  • 我想递归合并两个对象。所以如果存在循环引用,它就有可能无限进入循环。我不明白stringify 在这种情况下的意义。

标签: javascript recursion merge circular-reference cloning


【解决方案1】:

老问题,但我今天正在寻找这个问题 - 答案是:不。

https://api.jquery.com/jquery.extend/

在深度扩展中,Object 和 Array 是扩展的,但对象包装器是基本类型 例如 String、Boolean 和 Number 都不是。 深度扩展循环数据结构 将导致错误

对于不属于此行为的需求,编写自定义扩展 方法来代替,或者使用像 lodash 这样的库。

lodash 文档不是很清楚,但是 _.cloneDeep 支持克隆循环引用。

https://lodash.com/docs/4.17.10#cloneDeep

你最好使用像 lodash 这样聪明的东西,因为我认为它会正确检测多次引用的所有对象并创建整个对象图的真正克隆,并且所有循环引用都完好无损。

然而,这是一个简单的深度克隆,它使用简单的对象堆栈(它在 TypeScript 中)简单地忽略循环引用:

public static DeepClone(source: any, stack: any[] = null): any
{
    if (!source)
    {
        return source;
    }

    var result;

    result = Array.isArray(source) ? [] : {};

    for (var k in source)
    {
        var v = source[k];
        if (typeof v === "object") 
        {
            stack = stack || [];

            // Just ignore circular references? Or, to be clever, maintain a 
            // dictionary of object references from the original graph linked to
            // the new objects in the cloned graph, to preserve the full graph.
            if (stack.indexOf(source) >= 0)
            {
                return null;
            }

            stack.push(source);

            result[k] = this.DeepClone(v, stack);

            stack.pop();
        }
        else
        {
            result[k] = v;
        }
    }

    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多