• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:無限オブジェクト?のチェック方法)

無限オブジェクト?のチェック方法

このQ&Aのポイント
  • 無限オブジェクトのチェック方法を教えてください
  • objectオブジェクトが無限になっているか確認する方法を教えてください
  • objectオブジェクトが無限になっているか確認する方法についてお知らせください

質問者が選んだベストアンサー

  • ベストアンサー
  • Chaire
  • ベストアンサー率60% (79/130)
回答No.2

ECMA 262-5(ECMAScript 5.1)の 15.12.3 節に JSON.stringify のアルゴリズムが載っています。そこでオブジェクトの循環チェックもしていますので、参考にして下さい。 ざっくり言えば、オブジェクトのプロパティを列挙する際、オブジェクトをスタックに記憶しておきます。プロパティがオブジェクトを参照するたびに、すでに現れたかどうかチェックします。すでに現れたオブジェクトであれば探索を打ち切ります。 単純な力押しのアルゴリズムですので、すぐに実装できるでしょう。json3.js の "Check for cyclic structures" と注釈のある部分です。もし別に良い方法があればそちらを参考にしても構いません。 なお、スタックが配列であるなら、積まれたオブジェクトに番号を振ることになります。それを利用して Mozilla/JavaScript 独自拡張である Object#toSource() をエミュレートすることが可能です(循環しているオブジェクトは番号で示す)。

gorusura
質問者

お礼

ありがとうございます。 仕様書を確認したところ、無事流れをつかんで力技で出来ました! (たまに、#アクセスが拒否されました。#とのエラーが出るのがなんとも言えませんが…… try-catch で囲んで、対処しています)

その他の回答 (2)

  • Chaire
  • ベストアンサー率60% (79/130)
回答No.3

ああ、だから、単純に循環参照の有無だけをチェックしたければ JSON.stringify() に渡せば良いです。循環参照があれば TypeError が投げられます。 どのプロパティで、何のオブジェクトが循環しているかを調べたければ、スタックなりを使って地道にチェックして下さい。

  • think49
  • ベストアンサー率59% (285/482)
回答No.1

この手の循環参照はお勧めはしませんが…。 var test = object.test; test.test === test;

gorusura
質問者

お礼

回答ありがとうございます。 確かにその方法で可能ですが、 isCycle(object) のような形で使用したかったです。

関連するQ&A