этот код:

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]

результат = exp_to_test? (function () {… long_code …}) (): (function () {…}) () ; http://jsfiddle.net/2kpnV/

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

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

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

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

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

Один из приемов для регистрации в этих случаях — это регистрация отдельных значений или JSON-кодирование ссылки на объект:

console.log(obj.foo, obj.bar, obj.baz);
//or
console.log(JSON.stringify(obj));

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

var originalLog = console.log
console.log=function(obj){
    originalLog(JSON.parse(JSON.stringify(obj)))
}

Вы можете поместить setTimeout для запуска после модификации объекта.

setTimeout(()=>{
    console.log(this.daysOfTheYear)
},0)