Что представляет браузер и какие объекты он предоставляет
Что проверяют
Отделяете ли вы язык от среды, в которой он исполняется. Начинающие валят дерево документа, промисы и таймеры в одну кучу «это JavaScript», а от вас ждут понимания, что браузер это хост, который выдаёт движку набор объектов, и в другом хосте набор другой.
Как отвечать
Сначала про устройство. Браузер это несколько подсистем: сетевой слой, движок рендеринга (разбор HTML в дерево документа, CSS в объектную модель стилей, расчёт стилей, раскладка, отрисовка, композиция), движок JavaScript, хранилища, слой безопасности с политикой одного источника. Рендеринг и скрипты делят один поток вкладки, поэтому долгий синхронный код замораживает и анимации, и обработку кликов.
Дальше про объекты. Из языка приходят Object, Array, Promise, JSON, Math. Остальное даёт браузер:
window: глобальный объект вкладки, размеры, прокрутка,postMessage;documentи всё дерево DOM: узлы, события, всплытие и перехват;navigator,location,history,screen: сведения о среде, адрес, история переходов;- хранилища:
localStorage,sessionStorage,indexedDB,document.cookie; - сеть:
fetch,XMLHttpRequest,WebSocket,EventSource,AbortController; - планировщики и наблюдатели:
setTimeout,requestAnimationFrame,IntersectionObserver,MutationObserver,ResizeObserver; - фоновые потоки: обычные воркеры и сервис-воркер, своего
windowу них нет.
Полезно добавить, что доступ к камере, геолокации и уведомлениям требует разрешения пользователя и защищённого соединения.
Где спотыкаются
Называют setTimeout и console частью языка. В спецификации языка их нет, это интерфейсы хоста, и ведут они себя по-разному: минимальная задержка вложенных таймеров в браузере, отдельные фазы цикла событий на сервере.
Второе: считают window и globalThis синонимами. В воркере и при серверном рендеринге объекта window просто нет, обращение к нему валит страницу целиком, поэтому универсальный код проверяет наличие объекта или берёт globalThis.
Третье: определяют браузер по строке агента. Она подменяется, сама урезается производителями и врёт про версию. Проверять надо наличие нужной возможности, а не имя и номер браузера.