Консоль браузера: первый инструмент отладки
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Браузер умеет не только показывать страницы, но и рассказывать, что происходит у них «под капотом». Для этого в нём есть инструменты разработчика: туда попадают сообщения console.log, и там же браузер честно признаётся в ошибках.
Инструменты разработчика (DevTools) встроены в каждый браузер — ничего устанавливать не нужно. Самый универсальный способ открыть их — клавиша F12. А есть сочетания, которые открывают сразу консоль:
| Браузер | Windows / Linux | macOS |
|---|---|---|
| Chrome, Edge | Ctrl+Shift+J | Cmd+Option+J |
| Firefox | Ctrl+Shift+K | Cmd+Option+K |
| Safari | — | Cmd+Option+C |
Ещё один путь — правый клик в любом месте страницы и пункт «Просмотреть код». Откройте консоль прямо сейчас, введите строки ниже и нажмите Enter — браузер выполнит код и тут же покажет результат.
В Safari инструменты по умолчанию спрятаны. Зайдите в «Настройки» → «Дополнения» и включите самый нижний пункт — про меню и функции для веб-разработчиков. После этого заработает Cmd+Option+C, а в строке меню появится раздел «Разработка».
Сверху панели DevTools — ряд вкладок. Их много, но на первое время достаточно знать четыре:
| Вкладка | Зачем нужна |
|---|---|
| Console | Сюда печатает console.log, здесь же появляются ошибки. Можно вводить и выполнять любой JavaScript |
| Elements | Живой HTML и CSS страницы — как её видит браузер прямо сейчас. В Firefox называется «Инспектор» |
| Network | Все запросы страницы: скрипты, картинки, данные с сервера — и сколько времени они грузились |
| Sources | Файлы со скриптами и отладчик: можно остановить код на нужной строке и рассмотреть его в замедленной съёмке |
Пока мы учимся, девяносто процентов времени вы проведёте в Console. Остальные вкладки просто запомните в лицо — каждая из них ещё сыграет свою роль: Sources с отладчиком разбирает статья «Отладка в браузере», а Elements — «Инспектор элементов: смотрим дерево вживую» в части II.
console.log — рабочая лошадка отладки. Ему можно передать сколько угодно значений через запятую: консоль выведет их в одну строку через пробел, и это удобнее, чем склеивать всё в одну строку самому.
У сообщений есть уровни важности. console.warn красит вывод в жёлтый — «обрати внимание», console.error — в красный — «что-то сломалось». В больших проектах по этим уровням фильтруют вывод. А для массива однотипных объектов есть console.table: он рисует данные аккуратной таблицей вместо груды фигурных скобок.
У консоли есть встроенный таймер: console.time запускает секундомер с именем, а console.timeEnd с тем же именем останавливает его и печатает, сколько прошло. Удобно быстро прикинуть, какой кусок кода тормозит.
Красный текст в консоли выглядит пугающе, но устроен как почтовое извещение: у ошибки есть имя, сообщение, адрес (файл и строка) и список — кто кого вызывал. Научиться читать это извещение — половина отладки. Запустим код, который гарантированно упадёт:
Читаем сверху вниз. 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, выведите массив таблицей, а затем напечатайте, сколько котов в списке.
Допишите объекты через запятую внутри квадратных скобок и вызовите console.table(cats). Свойство length само посчитает элементы: console.log(cats.length); // 3.
Детектив по стеку
Запустите код как есть — он упадёт, так и задумано. Не исправляя его, ответьте по тексту ошибки: как она называется и что именно оказалось undefined. Потом найдите в коде строку, на которой всё случилось, и почините опечатку.
Консоль покажет TypeError: Cannot read properties of undefined (reading 'toUpperCase'), а в DevTools рядом будет адрес третьей строки: свойства nmae у объекта нет, поэтому user.nmae — это undefined, а у него нет методов. Исправление — user.name.