1

jQuery.extendから安全circular referenceですか?

Javascript で循環参照を回避するにはどうすればよいですか (再帰的に複製またはチェックする場合)。現在のターゲットが外部オブジェクトを参照している可能性があるため、プロパティ リストに現在のターゲットが存在することを確認するだけでは不十分です。

objects1 つのオプションは、これまでに取得したすべての別のリストを保持することです。しかし、それはメモリ消費を増加させ、スクリプトを停止するように求めますか?

クローン操作をワーカースレッドに移動したくありません。

4

1 に答える 1

0

古い質問ですが、今日これを探していました-答えは「いいえ」です。

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

深い拡張では、Object と Array は拡張されますが、String、Boolean、Number などのプリミティブ型のオブジェクト ラッパーは拡張されません。循環データ構造を深く拡張すると、エラーが発生します

この動作に当てはまらない必要がある場合は、代わりにカスタムの extends メソッドを記述するか、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;
}
于 2018-10-14T08:19:04.767 に答える