Необычное поведение console.log в инструментах разработчика Chrome

Возможный дубликат:
Является ли консоль JavaScript Chrome ленивой относительно оценки массивов?

Откройте инструменты разработчика Chrome и введите:

var a = [];console.log(a);a.push(1);console.log(a);

Вы ожидаете, что это выведет что-то вроде

[]
[1]

Но вместо этого он выводит

[1]
[1]

Поведение одинаково для

var a = [];console.log(a);a[0] = 1;console.log(a);

Может ли кто-нибудь объяснить это поведение?

Запуск Chrome в OS X. То же поведение на 32-битной Windows 7.

EDIT: поведение одинаково независимо от того, находятся ли операторы в одной строке или нет. Я просто предоставил их по одной строке, чтобы было легко протестировать.

Ввод

var a = [];
console.log(a);
a.push(1);
console.log(a);

в файле, тогда его выполнение дает то же поведение.

EDIT x 2 Смотрите: http://jsfiddle.net/9N4A6/, если вы не хотите, чтобы файл проверялся.

Ответ 1

Попробуйте это вместо:

var a = []; console.log(a.toString()); a.push(1); console.log(a.toString());

Не то, чтобы порядок оценки был странным, я уверен, но преобразование объектов в печатную форму происходит после выполнения всех операторов в момент, когда Chrome готов фактически выгрузить журнал.

Ответ 2

Такое же поведение здесь с Win7 на машине x64. Я предполагаю, что метод журнала содержит ссылку на a и ставит в очередь вызовы, которые находятся в одной строке.

EDIT. Это не проблема Chrome/ium, я был свидетелем того же самого с Firebug. Как я уже сказал, консольное ведение журнала должно быть поставлено в очередь.

Ответ 3

По крайней мере, с массивами вы можете клонировать массив для каждого вызова журнала:

var a = [];console.log([].concat(a));a.push(1);console.log([].concat(a));

Для объектов я рекомендую JSON:

var a = {};console.log(JSON.stringify(a));a[0]=1;console.log(JSON.stringify(a));

Ответ 4

Что такое "logged" - это объект "a" ... не просто текстовое представление "a" . Дисплей журнала достаточно умен, чтобы отобразить держатель места для объекта "a" , который заполняется/заполняется "позже" (похоже, в конце вызова события). Если вы вставляете инструкцию alert(), вы увидите значения, которые вы ожидаете (зарегистрированные значения "заполняются" ):

var a = [];
console.log(a);
alert('force console to display correctly');
a.push(1);
console.log(a);

Это кажется ошибкой в ​​Chrome для меня (вроде бы, нужно добавить инструкцию оповещения, чтобы увидеть правильную информацию о регистрации).

(обратите внимание, что этот вопрос показал в верхней части поиска google: "console.log chrome показывает только текущие значения", поэтому я подумал, что добавлю свой ответ)

Ответ 5

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

Если вы хотите текущее значение, просто скажите "console.log(a.toString()); или тому подобное.