Странное поведение с объектами & console.log

Этот код:

foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);

Создает следующий вывод в Chrome:

foo1 
[Object, Object, Object, Object, Object]  5
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]
     5 (index):23
foo2 
[Object, Object, Object, Object]  4
    0: Object
    1: Object
    2: Object
    3: Object
    length: 4
    __proto__: Array[0]

Скрипка: http://jsfiddle.net/2kpnV/

Почему это так?

71 голос | спросил dan-klasson 2 Maypm14 2014, 17:21:02

2 ответа


0

Исследование объектов с помощью console.log происходит асинхронно. Консоль получает ссылку на объект синхронно, но не отображает свойства объекта до тех пор, пока он не будет раскрыт (в некоторых случаях, в зависимости от браузера и наличия инструментов dev, открытых при записи журнала). Если объект был изменен до проверки его в консоли, показанные данные будут иметь обновленные значения.

Например, Chrome покажет немного i в окне, которое при наведении курсора говорит:

  

Значение объекта слева было снято при регистрации, значение ниже было оценено только сейчас.

чтобы вы знали, на что вы смотрите.

В этих случаях нужно регистрировать отдельные значения или JSON кодировать ссылку на объект:

console.log(obj.foo, obj.bar, obj.baz);
//or
console.log(JSON.stringify(obj));
ответил zzzzBov 2 Maypm14 2014, 17:25:51
0

Переопределение console.log решит проблему.

var originalLog = console.log
console.log=function(obj){
    originalLog(JSON.parse(JSON.stringify(obj)))
}
ответил Latpaw 7 12016vEurope/Moscow11bEurope/MoscowMon, 07 Nov 2016 04:55:24 +0300 2016, 04:55:24

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132