5

重複の可能性:
Chrome の JavaScript コンソールは配列の評価を怠っていますか?

次のコードを試します。

var myList = new Object();
var item   = new Object();
item.text  = "item-1";
myList[3]  = item;

console.log(myList);
console.log(myList[3].text);

// Assign another object to the same entry
var item2   = new Object();
item2.text  = "item-2";
myList[3]  = item2;

console.log(myList);
console.log(myList[3].text);

結果はかなり奇妙です:

* Object
  * 3: Object
      text: "item-2"

item-1

* Object
  * 3: Object
      text: "item-2"

item-2

しかし、(setTimeout を使用して) しばらくしてから 2 番目の部分を実行し、最初のオブジェクトを展開すると、次のようになります。

* Object
  * 3: Object
      text: "item-1"

item-1

* Object
  * 3: Object
      text: "item-2"

item-2

自分のコードの何が問題なのかを理解しようとすると多くの時間を浪費する可能性があるため、それを共有することは重要だと思います。また、誰かが未解決のバグなどについて言及している場合は、このチケットに返信してください。ありがとう!

4

5 に答える 5

5

私の見解では、これは私が本当にオフにしたいと思っている恐ろしく苛立たしい「機能」です。それは、何かがオブジェクトを更新した可能性がある時点を知らずに、デバッグを悪夢にします。コードにポイントを与えます。この機能は「ウォッチポイント」などには役立ちますが、「LOG」と呼ばれるものには役立ちません(手がかりは名前にあります)。

このコードフラグメントを考えてみましょう。

var person = {'name':'Tom'};
console.log( person);  //output the entire object variable
person.name = 'Thomas';
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'.

その後:

var person = {'name':'Tom'};
console.log( person.name);    //changed to output a string variable
person.name = 'Thomas';
//the output here, however, has not dynamically updated and correctly outputs 'Tom'
于 2012-07-18T10:27:26.833 に答える
3

これは既知のバグ(50316)であり、報告する前にバグトラッカーを確認しないため、何度も報告されます。

悲しいことに、これが解決されるかどうか/いつ解決されるかについての情報はありません。その瞬間まで、オブジェクトをに渡す前に、オブジェクトのクローンを作成する必要がありますconsole.log()

于 2012-06-20T12:13:55.663 に答える
0

Chrome 20.0.1132.57 m の最新バージョンでこの「問題」についていくつかの実験を行いました。重要なポイントを要約するには:-

  • console.log() は、コードが実行されると as "> Object" でオブジェクトへの参照を出力します
  • console.log() が実行されるコード行に関係なく、三角形をクリックしたときのオブジェクトの状態が表示されます。
  • オブジェクトを現在の状態で印刷する場合は、クローンを印刷します。console.log(JSON.parse(JSON.stringify(obj)));

このコードを使用して、自分のブラウザーでこれをテストできます。

window.onload = function() {chto = {a : 10, b : 20};
console.log('Open this object after 5 seconds')
console.log(chto);
console.log('Open this object before 5 seconds')
console.log(chto);
console.log('Console of the cloned object')
console.log(JSON.parse(JSON.stringify(chto)));
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000 ) ; };
于 2012-07-25T09:51:23.317 に答える
0

何よりも競合状態のように思えます。への参照を渡すだけなので、それが参照するconsole.log()値は、実際にログに記録されるまでに値が変更されている可能性があります。その後、setTimeout() を使用すると、ログに記録された後に値が変更されます。への参照を渡す代わりにconsole.log()、値の複製を渡します。

于 2012-06-20T11:49:02.557 に答える
0

これは、一部のブラウザのコンソール ログに関する既知の問題/機能です。

何かをログに記録しても、すぐにテキスト形式に変換されない場合があります。ログに記録するオブジェクトへの参照がログに保存されている場合、実際にログに表示されるときにテキスト形式に変換されます。

これには、実際にログウィンドウを開いてログを表示するまで、何かをログに記録してもパフォーマンスへの影響が非常に小さいという利点があります。

コードの実行中にログ ウィンドウを開いている場合でも、関数の実行中には更新が発生しないため (Javascript はシングル スレッドであるため)、コンソール ウィンドウには関数の最後にある値がそのまま表示されます。ウィンドウが更新されたとき。

于 2012-06-20T11:55:45.190 に答える