предисловие
Я считаю, что все будут использовать его при отладке кода.console.log,debuggerили调试工具. Но в целом большинство из нас будет использоватьconsole.log,ноconsole.logЭто действительно правдоподобно?
В заключение:console.logПри печати данных справочного типа они могут быть неточными. При отладке сложных точек останова используйте как можно большеdebuggerили调试工具.
исключение печати console.log
var a = {
index: 1,
}
console.log(a)
a.index++
console.log(a)
Приведенный выше код запускается в трех разных случаях, вы найдете более интересные места:
- платформа node.js
- Веб-консоль не открыта (Примечание: здесь вы ссылаетесь на код после запуска кода)
- При открытии веб-консоли (Примечание: это относится к открытию консоли для обновления)
Примечание. Приведенный выше веб-терминал был протестирован современными браузерами и обнаружил, что выражения 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)));
Сделайте глубокую копию текущего объекта и снова выведите.
После глубокого копирования он больше не указывает на ту же кучу.
отладчик или средство отладки
Использование отладчика или инструментов отладки может помочь нам избежать ошибок, и мы должны часто использовать их в нашей повседневной работе.