Вопрос по javascript, firefox, google-chrome, console, javascript-debugger – Ошибка в console.log? [Дубликат]

5

Possible Duplicate:
Is Chrome's JavaScript console lazy about evaluating arrays?

Я пытаюсь следующий код:

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) и разверну первый объект, я получу это правильно, т.е.

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

item-1

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

item-2

Я считаю важным поделиться этим, поскольку я думаю, что можно потратить много времени, пытаясь понять, что не так в его коде. И если у кого-то есть какая-либо ссылка на открытую ошибку или что-то еще - пожалуйста, ответьте на этот тикет. Спасибо!

Как ты это точно назвалsetTimeout? Я тоже попробовал и получил ожидаемые результаты. jsalonen
Какую версию Chrome вы используете? На какой платформе? Я попытался запустить ваш код в моей консоли, и я получил правильный / логический ответ j_freyre
Это не ошибка, это особенность! Console.log хранит ссылку на зарегистрированный объект, поэтому вы можете предварительно просмотреть объект во время выполнения. Если вы изменили атрибут объекта, то естественно, что это изменение также отображается в этом предварительном просмотре в реальном времени. Вы можете попробовать просмотреть объект, чтобы увидеть, что его & quot; иерархия & quot; бесконечно глубоко, поэтому кешировать его невозможно. average Joe

Ваш Ответ

5   ответов
3

этоизвестная ошибка (50316) об этом сообщают снова и снова, потому что люди не смотрят на багтрекер, прежде чем сообщать:

к сожалению, нет никакой информации о том, если / когда это будет решено. до этого момента вам нужно будет клонировать объекты, прежде чем передавать ихconsole.log().

0

Я провел несколько экспериментов с этой «проблемой». На последней версии Chrome 20.0.1132.57 м. Подведем итоги по ключевым моментам: -

  • console.log() prints a reference to the object with as "> Object" when the code is executed
  • The state of the object when you click on the triangle is displayed, irrespective of the line of code where the console.log() is executed
  • If you want to print the object in its current state, print a clone 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 ) ; };
0

Это известная проблема / функция с консольным журналом в некоторых браузерах.

Когда вы что-то регистрируете, это может быть не сразу преобразовано в текстовый формат. Если журнал хранит ссылку на объект, который вы регистрируете, он будет преобразован в текстовый формат, когда он фактически отображается в журнале.

Это имеет то преимущество, что запись чего-либо очень мало влияет на производительность, пока вы фактически не откроете окно журнала, чтобы отобразить журнал.

Даже если у вас открыто окно журнала во время выполнения кода, обновления не происходит, пока ваша функция работает (поскольку Javascript является однопоточным), поэтому в окне консоли будут отображаться значения в конце функции, когда окно обновляется.

0

Для меня это больше похоже на состояние гонки, чем на что-либо еще. Поскольку вы только передаете ссылку наconsole.log()значение, к которому оно относится, вероятно, изменило значение к тому времени, когда оно фактически зарегистрировано. Затем, когда вы используете setTimeout (), значение изменяется после того, как оно было зарегистрировано. Вместо передачи ссылки наconsole.log()передать клон значения.

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'
дерьмо, и я подумал, что у меня был квантовый компьютер, который мог обновлять значения до того, как они были обновлены!

Похожие вопросы