11

私が信じている ECMA 標準の一部は、オブジェクトが配列のようなものである場合、Javascript コンソールはオブジェクトを配列として表示するということです。

例: ["hello", "world"] 数値でインデックス付けされた文字列を含むオブジェクトの場合。

配列のような動作は、オブジェクトに存在する長さプロパティと splice メソッド、および数値インデックス付きプロパティとして定義されます。

私たちの多くは、過去に jQuery でこれを見たことがあるでしょう。

私はこの振る舞いを利用しようとしてきましたが、それが望ましいと考えています。ただし、インデックスが変更されたときに追加の処理を実行できるように、インデックスがゲッター/セッターを使用して設定するという追加の要件があります。

ただし、これを行うと、上記の配列は代わりに次のようにレンダリングされます。

【未定×2】

ただし、それ以外の点では、オブジェクトは単純な例とまったく同じように動作します。

より良い説明については、この Fiddle を参照してください: http://jsfiddle.net/5YgAv/

ご覧のように?2 つの非常によく似た例ですが、getter の存在によりコンソールで壊れています。

最新の Chromium ソース コードをデバッグしてきましたが、Chrome は基本的に getter 関数を含むメッセージをコンソールにプッシュしているようです。ただし、関数を呼び出して値を取得できるようにコンソールのソース コードを変更する方法はありません。それが可能であれば、開発者ツールを変更してゲッターとセッターを正しく処理することができます。

私が知りたいのは、誰かがこの興味深い小さなバグについて洞察を持っているか、または Chrome チームにバグとして報告する前にどのように修正するのが最善かということです. 私は実際にこれを何らかの方法で自分で修正したいと思っています。

また、配列のようなオブジェクトのプロパティが変更されたときに特別な処理を行うことができるエレガントな回避策も受け入れています。

助けてオビ-スタックオーバーフロー-ケノービ、あなただけが頼りです!

【ライアン】

4

1 に答える 1

2

これは、Chromeが配列のように配列を書き出さない理由の質問には答えませんが、Chromeを「だまして」それを実行させる方法があります。幸いなことに、それはとても簡単です。

  1. オブジェクトのtoString関数を上書きして、データ変数を返します
  2. 配列をログに記録するときは、myArray.toString();としてログに記録します。

このjsFiddleを参照してください:http://jsfiddle.net/YXwxS/

それまでの間、これは興味深い問題なので、これについては調査を続けます:)

于 2012-07-14T12:16:16.613 に答える