Вопросы на собеседовании фронтенд-разработчика. Общие вопросы по JS
Часто задаваемые базовые вопросы по JavaScript
Сравнение null и undefined
Null и undefined при сравнении нестрогим оператором == равны друг другу, и никаким другим значениям во всем языке.
Из спецификации:
Если
xравно null иy– undefined, вернуть true. Еслиx– undefined иy– null, вернуть true.
function compareNullAndUndefined(value: any): boolean {
return value === null || value === undefined;
}Оператор нулевого слияния
Оператор ?? возвращает значение правого операнда, если значение левого операнда содержит null или undefined, иначе вернет значение левого операнда.
Различия === и ==
Оператор == допускает преобразование типов при проверке равенства, а === запрещает преобразование типа.
Типы в JS
В JavaScript есть 8 встроенных типов:
- null
- undefined
- boolean
- number
- bigInt
- string
- object
- symbol
Все эти типы, за исключение object называются «примитивами».
Для проверки типов используется оператор typeof
typeof undefined === "undefined" // trueНО
typeof null === "object" // trueПроверка на null может выглядеть следующим образом
const some = null;
some === null // true
!some && typeof some === "object" // trueВсе примитивные значения всегда передаются копированием значения.
Объекты (массивы и все объектные обёртки) и функции при присваивании и передаче всегда создают копию ссылки.
Область видимости
Область видимости (scope) — определенный набор правил для хранения переменных в определенном месте и их нахождение в будущем.
Существует две основные модели работы области видимости: лексическая и динамическая. В JavaScript используется лексическая модель области видимости.
Лексическая область видимости определяется тем, где были размещены переменные и блоки области видимости. Фиксируется во время написания программы.
Поднятие (hoisting)
Во время компиляции происходит связывание объявлений переменных и функций с соответствующими областями видимости и только после этого выполняется любая часть кода.
Поднимаются только объявления, присваивание не поднимаются (включая присваивания функциональных выражений).
Temporal Dead Zone
TDZ — промежуток времени между тем, когда переменная становится доступной в области видимости, и её объявлением.
Если обратиться к переменной, которая находятся в TDZ, то получим исключение ReferenceError.
let vs const vs var
var — имеет функциональную область видимости и поднимаются (hoisted) в начало своей области видимости. Может быть переопределена.
let — имеет блочную область видимости, ограниченную фигурными скобками {} и не поднимаются. Может быть переопределена.
const — имеет блочную область видимости и не может быть переопределена.
Замыкание
Замыкание — способность функции запоминать свою лексическую область видимости и обращаться к ней даже тогда, когда функция выполняется вне своей лексической области видимости.
Место вызова (call-site) и стек вызовов
Место вызова — точка, из которой вызывается функция
Стек вызовов — стек функций, которые были вызваны для того, чтобы выполнение дошло до своего текущего состояния
Различия между for...in и for...of
Оба оператора производят обход объектов. Разница в том, как они это делают.
Для for...in обход перечисляемых свойств объекта осуществляется в произвольном порядке.
Для for...of обход происходит в соответствии с тем, какой порядок определен в итерируемом объекте.