Консоль Google Chrome.log () несоответствие объектам и массивам
я помогал коллеге отлаживать код сегодня и я заметил странное поведение с console.log()
в Google Chrome:
получается, что если вы:
создайте вложенный массив (например, [[345, "test"]])
войдите в массив на консоль с помощью
console.log()
.измените одно из значений внутреннего массива, затем
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"]
такое поведение не происходит в 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));