Ответ Уайти имеет хорошую информацию, но это не правильный ответ на этот вопрос.
Поведение, описанное OP, является частью ошибки, о которой впервые сообщалось в марте 2010, исправленный для Webkit в августе 2012 года, но на момент написания этой статьи он еще не интегрирован в Google Chrome. Поведение зависит от того, открыто или закрыто окно консоли в момент, когда литерал объекта передается в console.log()
.
Выдержки из исходного отчета об ошибке ( https: // bugs .webkit.org / show_bug.cgi? id = 35801 ):
Описание От mitch kramer 2010-03-05 11:37:45 PST
1) создать объектный литерал с одним или несколькими свойствами
2) console.log этот объект, но оставить его закрытым (не расширять его в консоли)
3) изменить один свойств к новому значению
теперь открывается, что console.log, и вы увидите, что по какой-то причине оно имеет новое значение, даже несмотря на то, что в момент его создания значение было другим.
Я должен указать, что если вы его откроете, он сохранит правильное значение, если это было неясно.
blockquote>Ответ от разработчика Chromium:
Комментарий # 2 От Pavel Feldman 2010-03-09 06:33:36 PST
Не думаю, что мы когда-нибудь это исправим. Мы не можем клонировать объект при его сбросе в консоль, и мы также не можем слушать изменения свойств объекта, чтобы сделать его всегда актуальным.
Мы должны убедиться, что существующее поведение ожидается.
blockquote>Многое жалобы последовало, и в конечном итоге это привело к исправлению ошибки.
Заметки о внесении изменений из патча, реализованного в августе 2012 года ( http: //trac.webkit .org / changeset / 125174 ):
На сегодняшний день сброс объекта (массива) в консоль приведет к тому, что свойства объекта будут прочитаны при расширении объекта консоли (т.е. лениво) , Это означает, что сброс одного и того же объекта при его изменении будет трудно отлаживать с помощью консоли.
Это изменение начинает генерировать сокращенные предварительные просмотры для объектов / массивов в момент их регистрации и передает эту информацию вперед -конец. Это происходит только тогда, когда front-end уже открыт, он работает только для console.log (), а не для взаимодействия с консолью.
blockquote>