

**ディープコピーはどうやって確認するのでしょうか？**  
・コピー前後でオブジェクトの参照先が異なるため、比較してtrueになることはない？  
・ループして各プロパティの値が一致していたら、ディープコピー出来ている、と判断して良いのでしょうか？

**想定ケース**

[code]

    JSON.parse(JSON.stringify(obj));
    
[/code]

で作成されたオブジェクトがディープコピーであるかどうかを判定したいと考えています。

* * *

**追記**

・(npmのcloneを使用した場合などで、)「あるオブジェクト」が「別のオブジェクト」のディープコピーであることを条件分岐等で確認するにはどうすれば良いでしょうか？

[code]

    var clone = require('clone');
    
    var a, b;
    
    a = { foo: { bar: 'baz' } };  // initial value of a 
    
    b = clone(a);                 // clone a -> b 
    //a.foo.bar = 'foo';            // change a 
    
    console.log(a);               // show a 
    console.log(b);
    
    console.log(a==b); //false
    console.log(a===b); //false
    
[/code]


CC BY-SA 3.0
2016-11-27T00:27:58.427
30701
2017-01-06T16:50:56.357
2016-12-28T03:22:43.840
7886
7886
question
javascript
ディープコピーを確認する方法は？　コピー前後でオブジェクトの参照先が異なるため、比較してtrueになることはない？


ディープコピーというのは、オブジェクトへの参照を保持できる言語において、複合オブジェクトをコピーする際に、そこに含まれる子オブジェクトの参照をどうコピーするか、

  * 実体はそのままに参照を複製する：シャローコピー
  * 実体を複製する：ディープコピー

という程度の定義でしかありません。

実体を複製するというのは、要するに「同じものを真似して作る」ということです。

[code]

    var a = { foo: [1, 2], bar: {x: 1} };
    a.self = a;
    
    var b = { foo: [1, 2], bar: {x: 1} };
    b.self = b;
    
[/code]

既存のオブジェクト a をそっくりそのまま真似して b を作りましたが、b からは a
の一部分たりとも参照していません。これをプログラムで行うのがディープコピーです。

実際には実体の複製が難しいもの（JSだとクロージャなど）や、目的によっては複製したくないもの（DOMオブジェクトなど）があったり、手順も再現するのか状態だけ再現するのかといった話もあるので、
**具体的に何をどうやって複製するかは様々です** 。ですから、何をどう検証すれば正しいディープコピーと判断できるのかも一概には言えないわけです。

仕様がはっきりしていれば、それが全て正しく機能しているのかを順番に検証するだけです。例えばnpmのcloneライブラリにもテストコードがあります。

<https://github.com/pvorb/clone/blob/master/test.js>

> ループして各プロパティの値が一致していたら、ディープコピー出来ている、と判断して良いのでしょうか？

再帰的にプロパティの値を比較するということなら、考え方はあっています。ただし再帰構造はそのままだと無限ループになってしまいますし、`Object.defineProperty()`
で定義したプロパティも再現するなら、プロパティの列挙・比較の方法も選ぶ必要があるでしょう。


CC BY-SA 3.0
2017-01-06T16:37:03.210
31676
2017-01-06T16:50:56.357
2017-01-06T16:50:56.357
8000
8000
30701
answer