ホームページ  >  に質問  >  本文

javascript - 参照オブジェクトの割り当て、深いコピーと浅いコピー jquery.extend

ある参照型が別の参照型に割り当てられている場合、これらは同じアドレスを指しているだけで、演算は相互に影響します。
ディープコピーは、以前のオブジェクトまたは配列が影響を受けないようにスペースを再割り当てします。
浅いコピーは参照型の割り当てと同等です。

リーリー

jquery のソースコードを見ましたが、ディープコピーには再帰が必要です。
しかし、それが相互影響とどのような関係があるのか​​、それとも上記の概念についての私の理解が間違っているのか理解できません。

PHPzPHPz2734日前968

全員に返信(2)返信します

  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:35:54

    浅いコピー

    オブジェクトの最上位キーのみを走査して (対応する参照に) 再割り当てします。例:

    リーリー リーリー このプロセスでは、すべてのトップレベル要素が b から取り出されます。つまり、b. a に残り、次に a.x === b.x、a.y === b.y、a.z === b.z です。これらはすべて、同じオブジェクト。参照なので a.x.name = 'x3' のように a.x を操作すると b.x.name も 'x3' になります。

    ディープコピー

    ディープコピーは、参照ではなく再割り当てのためにオブジェクト要素の最後のレイヤーに深く入ります。上記の a と b を例として、次を実行します:

    リーリー

    b の内部を深く探索し、各ノードの値を a に対応するノード (まったく同じ) と比較し、それらが異なる場合は、a のストレージ領域を開き、a が存在しない場合はそれに値を割り当てます。 、このノードは作成後に値を割り当てます。 a の第 1 レベルの子ノードと b の第 1 レベルの子ノードの間には等価性がなく、== さえ成立しません。

    ディープコピー後、aの元のノードの一部は保持され、bの過去のノードは上書きまたは追加されますが、bとは参照関係がないため、aのノードを変更してもbには影響しません。これは、元のデータに影響を与えないように、データを処理する前にディープ コピーを作成する必要がある場合に非常に便利です。

    ディープコピー中、配列のインデックス番号はキー名として扱われるため、配列要素は元のデータに追加されるのではなく変更されます。例:

    リーリー

    あなたが得るもの:

    リーリー

    b の最初のプリミティブが a の最初の要素にマージされます。このマージは、配列が要素のインデックス番号をキーとして動作するためです。したがって、extend を使用して配列をマージすることはできませんが、merge または concat の使用を検討する必要があります。

    返事
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:54

    これは単なる名前の重複であり、ディープコピー/シャローコピーとは何の関係もありません。これは、再帰的コピーと呼ぶ方が適切です。

    返事
    0
  • キャンセル返事