Firefox console.table показывает неверные данные - PullRequest
0 голосов
/ 15 декабря 2018

Давайте попробуем следующий код JavaScript:

 var Matrix = [
  [1,2,3],
  [4,5,6]
 ];

  console.table(Matrix);   // print initial data
  Matrix[1][1] = 9;        // change one value
  console.table(Matrix);   // print updated data

И вот результат:

Resulting Matrix

Я проверял этос Firefox 64.0 .Почему оба вызова console.table приводят к одному и тому же выводу?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

console.table не является синхронным, поэтому перед отображением начального содержимого Matrix обновление выполнено.Просто добавьте задержку, подобную этой, и вы увидите, что два значения отображаются правильно:

var Matrix = [
  [1, 2, 3],
  [4, 5, 6]
];

console.table(Matrix);   // print initial data
setTimeout(() => {
  Matrix[1][1] = 9;        // change one value
  console.table(Matrix);   // print updated data
}, 2000);

Конечно, это не практично, но, глядя на веб-сайт mozilla, он говорит: Примечание: эта функция доступна в Web Workers.Но французский перевод говорит, что эта функция доступна через веб-работников, что объясняет поведение, которое вы видите.

Обходным решением будет вызвать console.table для глубокой копии Matrix, чтобы вы могли продолжить ее модификацию.с минимальным воздействием на вас окончательный код.

0 голосов
/ 15 декабря 2018

console.log не стандартизирован, поэтому поведение довольно неопределенное,

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

Таким образом, консоль может либо клонироваться (сериализироваться)изменяемые объекты, которые вы записали в журнал, или он будет хранить ссылки на них.Первый плохо работает с глубокими предметами.Кроме того, по крайней мере начальный рендеринг в консоли, вероятно, покажет «текущее» состояние объекта, то есть то, когда он был зарегистрирован - в вашем примере вы видите Object {}. напоминание о том, что многомерный массив также является объектом

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

на этот ответ влияет Bergis ответ на этот вопрос.

...