Консоль Google Chrome.log () несоответствие объектам и массивам

я помогал коллеге отлаживать код сегодня и я заметил странное поведение с console.log() в Google Chrome:

получается, что если вы:

  1. создайте вложенный массив (например, [[345, "test"]])

  2. войдите в массив на консоль с помощью console.log().

  3. измените одно из значений внутреннего массива, затем console.log() выведет более позднее значение -- не значения массива в то время console.log() был казнен.

JavaScript:

var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]

var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}


var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]

Пример JSFiddle

такое поведение не происходит в Firefox.

также отметить, если я шагнул через его код строка за строкой в отладчике Chrome, то console.log() выводит правильные значения.

есть ли объяснение этому странному явлению или это просто ошибка с Google Хром?

EDIT:

я сузил шаги, чтобы воспроизвести непоследовательный console.log() поведение:

если добавить этот скрипт на свою страницу:

var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
    greetings.push('goodbye');
},3000);

и откройте его в новом окне с Chrome окно консоли уже открыто, потом console.log() вывод будет отличаться от того, если вы загрузите страницу с окно консоли закрыто. вот JSFiddle, который демонстрирует это.

в первом случае, когда окно консоли уже открыто,console.log() выведет текущее значение массива (т. е. два элемента).

во втором случае, когда окно консоли изначально закрыто и открыто только после загрузки страницы console.log() выведет более поздние значения массива (т. е. три элемента).

это ошибка в Google Chrome console.log() функциональность?

2 ответов


после долгих раскопок я обнаружил, что это было сообщено как ошибка, исправленная в Webkit, но, по-видимому, еще не втянута в Google Chrome.

насколько я могу судить, проблема была первоначально сообщена здесь:https://bugs.webkit.org/show_bug.cgi?id=35801:

описание от Митча Крамера 2010-03-05 11: 37: 45 PST

1) Создайте объектный литерал с одним или несколькими свойствами

2 консоли).журнал этот объект но оставьте его закрытым (не разворачивайте его в консоли)

3) Измените одно из свойств на новое значение

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

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

ответ от разработчика Chromium:

комментарий №2 от Павла Фельдмана 2010-03-09 06:33: 36 PST

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

мы должны убедиться, что существующее поведение ожидается.

исправить был реализовано два с половиной года спустя 9 августа 2012 года для Webkit ( http://trac.webkit.org/changeset/125174), но он, похоже, еще не попал в Chrome.

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

Это изменение начинает генерировать сокращенные превью для объектов / массивов в данный момент их ведение журнала и передает эту информацию в интерфейс. Это происходит только тогда, когда front-end уже открыт, работает только для консоли.log (), а не взаимодействие с живой консолью.


Я нашел обходной путь для этой ошибки / функции.

console.log(JSON.parse(JSON.stringify(myObject)));

Edit: к сожалению, это не будет работать для непримитивных значений, таких как функции. Используйте здесь другую утилиту клонирования.

пример jQuery:

console.log($.extend({}, myObject));