たまたま動いているコード オブジェクト同士の比較に JSON.stringify() を使う例がそこかしこで見られます。 典型的には、 のようなコードです。 オブジェクトの中身を再帰的にたどって比較する、いわゆる「深い比較」で「deep equality」を判定したい場合に使われる事が多いようですが、これはとても危うく、いつ壊れてもおかしくないコードです。 理由 まず、JSON化する際にそのまま含まれないプロパティ(enumerableでなかったり、値が関数であったりするものなど)がありますが、これは考慮の上でのことが多いでしょう 問題は、配列でないJavaScriptのオブジェクトには順序が無く、JSONにされる際にもプロパティの順序がどうなるか決まっていないことです。 MDNには、 配列でないオブジェクトのプロパティは、特定の順序で文字列化されることを保証されてはいません。文字列化にお
![オブジェクトの比較に JSON.stringify() を使ってはいけない —— プロパティには順序が無い - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/2cee380be3b13990933a2d00059bffc90b75f2fe/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgyJUFBJUUzJTgzJTk2JUUzJTgyJUI4JUUzJTgyJUE3JUUzJTgyJUFGJUUzJTgzJTg4JUUzJTgxJUFFJUU2JUFGJTk0JUU4JUJDJTgzJUUzJTgxJUFCJTIwSlNPTi5zdHJpbmdpZnklMjglMjklMjAlRTMlODIlOTIlRTQlQkQlQkYlRTMlODElQTMlRTMlODElQTYlRTMlODElQUYlRTMlODElODQlRTMlODElOTElRTMlODElQUElRTMlODElODQlMjAlRTIlODAlOTQlRTIlODAlOTQlMjAlRTMlODMlOTclRTMlODMlQUQlRTMlODMlOTElRTMlODMlODYlRTMlODIlQTMlRTMlODElQUIlRTMlODElQUYlRTklQTAlODYlRTUlQkElOEYlRTMlODElOEMlRTclODQlQTElRTMlODElODQmdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTI1NDg0NTVkYjg3YmYzODM4ZTMwNDM3MmY1ZTg1Y2Y2%26mark-x%3D120%26mark-y%3D96%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDA4eDkmdHh0LWNvbG9yPSUyMzNBM0MzQyZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTZkZmFiMzlkNWVkNzg4ZWQ1YzE0ZjJkZWI0ZjU0NGUx%26blend-x%3D120%26blend-y%3D500%26blend-mode%3Dnormal%26s%3D67e57e2b16b27a88b889aec2c7fc3e41)