Необычное поведение 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()); или тому подобное.