Действительно ли console.log заслуживает доверия?

JavaScript

предисловие

Я считаю, что все будут использовать его при отладке кода.console.log,debuggerили调试工具. Но в целом большинство из нас будет использоватьconsole.log,ноconsole.logЭто действительно правдоподобно?

В заключение:console.logПри печати данных справочного типа они могут быть неточными. При отладке сложных точек останова используйте как можно большеdebuggerили调试工具.

исключение печати console.log

var a = {
  index: 1,
}
console.log(a)
a.index++
console.log(a)

Приведенный выше код запускается в трех разных случаях, вы найдете более интересные места:

  1. платформа node.js

  1. Веб-консоль не открыта (Примечание: здесь вы ссылаетесь на код после запуска кода)

  1. При открытии веб-консоли (Примечание: это относится к открытию консоли для обновления)

Примечание. Приведенный выше веб-терминал был протестирован современными браузерами и обнаружил, что выражения chrome, edge и firefox одинаковы, что аналогично приведенному выше. Safari не может расширить объект в третьем случае.

Анализ аномалий

Почему веб-сторона ведет себя иначе, чем node.js?

мы все знаем引用类型, каждый раз, когда вы используете объект, вы просто используете ссылку на объект в куче. Ситуация на платформе node.js такая, как мы и ожидали, но почему это происходит на стороне веба?

Как упоминалось в разделе «Вы не знаете javascript в томе»: семейство методов console.* не является официальной частью JavaScript, но добавляется в JavaScript хост-средой. Таким образом, различные браузеры и среды JavaScript могут быть реализованы по своему усмотрению.

Хотя в большинстве браузеровconsole.logВходящий контент не будет выводиться немедленно, а будет передан браузеру для асинхронной обработки для повышения производительности.

Здесь я просто понимаю, что: платформа node.js — это синхронная печать, а платформа браузера — асинхронная печать.

Почему это не так, открыта веб-консоль или нет?

консоль не открывается

console.logВ большинстве браузеров работает после открытия консоли, то есть при открытии консоли будет происходить печать.

В приведенном выше коде перейдите вconsole.logПараметр in - это адрес.Когда код выполняется, откройте консоль и начните печатать, тогда то, что он печатает, на самом деле является полностью обработанным объектом. Это эквивалентно этой последовательности выполнения:

var a = {
  index: 1,
}
a.index++
console.log(a)
console.log(a)

Откройте консоль

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

решение

глубокая копия (не рекомендуется)

console.log(JSON.parse(JSON.stringify(a)));

Сделайте глубокую копию текущего объекта и снова выведите.

После глубокого копирования он больше не указывает на ту же кучу.

отладчик или средство отладки

Использование отладчика или инструментов отладки может помочь нам избежать ошибок, и мы должны часто использовать их в нашей повседневной работе.