質問: 'foo'; // change a console.log(a); // show a console.log(b); console.log(a==b); //false console.log(a===b); //false ```
回答: ディープコピーというのは、オブジェクトへの参照を保持できる言語において、複合オブジェクトをコピーする際に、そこに含まれる子オブジェクトの参照をどうコピーするか、 * 実体はそのままに参照を複製する:シャローコピー * 実体を複製する:ディープコピー という程度の定義でしかありません。 実体を複製するというのは、要するに「同じものを真似して作る」ということです。 ``` var a = { foo: [1, 2], bar: {x: 1} }; a.self = a; var b = { foo: [1, 2], bar: {x: 1} }; b.self = b; ``` 既存のオブジェクト a をそっくりそのまま真似して b を作りましたが、b からは a の一部分たりとも参照していません。これをプログラムで行うのがディープコピーです。 実際には実体の複製が難しいもの(JSだとクロージャなど)や、目的によっては複製したくないもの(DOMオブジェクトなど)があったり、手順も再現するのか状態だけ再現するのかといった話もあるので、**具体的に何をどうやって複製するかは様々です**。ですから、何をどう検証すれば正しいディープコピーと判断できるのかも一概には言えないわけです。 仕様がはっきりしていれば、それが全て正しく機能しているのかを順番に検証するだけです。例えばnpmのcloneライブラリにもテストコードがあります。 > > ループして各プロパティの値が一致していたら、ディープコピー出来ている、と判断して良いのでしょうか? > > > 再帰的にプロパティの値を比較するということなら、考え方はあっています。ただし再帰構造はそのままだと無限ループになってしまいますし、`Object.defineProperty()` で定義したプロパティも再現するなら、プロパティの列挙・比較の方法も選ぶ必要があるでしょう。