Консоль браузера: первый инструмент отладки

знакомство≈ 6 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Браузер умеет не только показывать страницы, но и рассказывать, что происходит у них «под капотом». Для этого в нём есть инструменты разработчика: туда попадают сообщения console.log, и там же браузер честно признаётся в ошибках.

Разделы темы:·

Инструменты разработчика (DevTools) встроены в каждый браузер — ничего устанавливать не нужно. Самый универсальный способ открыть их — клавиша F12. А есть сочетания, которые открывают сразу консоль:

БраузерWindows / LinuxmacOS
Chrome, EdgeCtrl+Shift+JCmd+Option+J
FirefoxCtrl+Shift+KCmd+Option+K
Safari—Cmd+Option+C

Ещё один путь — правый клик в любом месте страницы и пункт «Просмотреть код». Откройте консоль прямо сейчас, введите строки ниже и нажмите Enter — браузер выполнит код и тут же покажет результат.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

В Safari инструменты по умолчанию спрятаны. Зайдите в «Настройки» → «Дополнения» и включите самый нижний пункт — про меню и функции для веб-разработчиков. После этого заработает Cmd+Option+C, а в строке меню появится раздел «Разработка».

Сверху панели DevTools — ряд вкладок. Их много, но на первое время достаточно знать четыре:

ВкладкаЗачем нужна
ConsoleСюда печатает console.log, здесь же появляются ошибки. Можно вводить и выполнять любой JavaScript
ElementsЖивой HTML и CSS страницы — как её видит браузер прямо сейчас. В Firefox называется «Инспектор»
NetworkВсе запросы страницы: скрипты, картинки, данные с сервера — и сколько времени они грузились
SourcesФайлы со скриптами и отладчик: можно остановить код на нужной строке и рассмотреть его в замедленной съёмке

Пока мы учимся, девяносто процентов времени вы проведёте в Console. Остальные вкладки просто запомните в лицо — каждая из них ещё сыграет свою роль: Sources с отладчиком разбирает статья «Отладка в браузере», а Elements — «Инспектор элементов: смотрим дерево вживую» в части II.

console.log — рабочая лошадка отладки. Ему можно передать сколько угодно значений через запятую: консоль выведет их в одну строку через пробел, и это удобнее, чем склеивать всё в одну строку самому.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

У сообщений есть уровни важности. console.warn красит вывод в жёлтый — «обрати внимание», console.error — в красный — «что-то сломалось». В больших проектах по этим уровням фильтруют вывод. А для массива однотипных объектов есть console.table: он рисует данные аккуратной таблицей вместо груды фигурных скобок.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.
js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

У консоли есть встроенный таймер: console.time запускает секундомер с именем, а console.timeEnd с тем же именем останавливает его и печатает, сколько прошло. Удобно быстро прикинуть, какой кусок кода тормозит.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Красный текст в консоли выглядит пугающе, но устроен как почтовое извещение: у ошибки есть имя, сообщение, адрес (файл и строка) и список — кто кого вызывал. Научиться читать это извещение — половина отладки. Запустим код, который гарантированно упадёт:

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Читаем сверху вниз. ReferenceError — имя ошибки: браузер встретил имя, которого не знает. После двоеточия — сообщение: sayHello is not defined, то есть «sayHello не определено». Этими двумя частями панель вывода под примером и ограничивается, а настоящая консоль DevTools покажет ещё две. Справа встанет ссылка вида script.js:2, файл и номер строки: клик по ней открывает код прямо в нужном месте. Ниже — стек вызовов: первая строка показывает, где именно всё сломалось (внутри start), а каждая следующая — кто это место вызвал.

Что случилось → где → кто позвал. Ошибка всегда читается сверху вниз.

Имя ошибкиТипичная причина
ReferenceErrorОбращение к имени, которого нет: опечатка в названии переменной или функции
TypeErrorЗначение не того типа: вызвали как функцию не-функцию или полезли в свойство undefined
SyntaxErrorБраузер вообще не смог разобрать код: незакрытая скобка, лишняя запятая

Важная деталь: необработанная ошибка останавливает скрипт. Всё, что было до неё, успело выполниться, а код после падения уже не запустится. Поэтому ошибку чинят сразу — она не рассосётся сама.

  • DevTools открываются клавишей F12 (на Mac — Cmd+Option+I), а сразу в консоль ведёт Cmd+Option+J; главная вкладка для новичка — Console.
  • console.log печатает любые значения и принимает их списком через запятую.
  • console.warn и console.error подсвечивают сообщения по важности, а console.table выводит массив объектов таблицей.
  • Ошибка состоит из имени, сообщения, адреса файл:строка и стека вызовов — читайте её сверху вниз.
  • Необработанная ошибка останавливает скрипт: код после места падения не выполнится.

1/3Каким методом удобнее всего вывести массив объектов в виде таблицы?

2/3Браузер вывел: ReferenceError: totl is not defined. Чем является слово ReferenceError?

3/3На пятой строке скрипта возникла необработанная ошибка. Что произойдёт с шестой строкой?

Кошачья перепись

Допишите код: добавьте в массив ещё двух котов со своими name и age, выведите массив таблицей, а затем напечатайте, сколько котов в списке.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Допишите объекты через запятую внутри квадратных скобок и вызовите console.table(cats). Свойство length само посчитает элементы: console.log(cats.length); // 3.

Детектив по стеку

Запустите код как есть — он упадёт, так и задумано. Не исправляя его, ответьте по тексту ошибки: как она называется и что именно оказалось undefined. Потом найдите в коде строку, на которой всё случилось, и почините опечатку.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Консоль покажет TypeError: Cannot read properties of undefined (reading 'toUpperCase'), а в DevTools рядом будет адрес третьей строки: свойства nmae у объекта нет, поэтому user.nmae — это undefined, а у него нет методов. Исправление — user.name.