Core JS Flashcards
Як працює двигун v8?
Разработан компанией google, написан на c++. Используется в Chrome и Node.js. Нода состоит из v8 и libuv, который обеспечивает i/o (FS, Child processes, threading).
V8 переводит код JavaScript в более эффективный машинный код во время исполнения с помощью Just-In-Time компилятора, вместо использования интерпретатора.
Что такое event loop?
Когда наш код запускается, заполняется стек функций, которые выполняются синхронно в одном потоке. Но определенные операции, такие как таймеры работа с файлами, сетью,запускаются отдельно от основного потока, где они уже могут выполняться параллельно. Когда обработка операции завершена, функция с результатом становится в очередь и как только стек функций будет пустой, она может выполниться.
Коллбеки попадают в message queue, результат промисов в job queue. У job queue приоритет выше и результат промиса покажется раньше.
Как JS работает с памятью?
Сборщик мусора наблюдает за данными и время от времени удаляет из памяти то, что стало недостижимым.
Основной принцип сборщика мусора - значение остается в памяти, пока на него есть хотябы одна ссылка с родительской области видимости.
Для оптимизации, в современных интерпретаторах используется подход, в котором, в памяти есть 2 области, для старых и новых объектов. “Новая” область очищается чаще. “Старая” реже.
Антипаттерны работы с памятью
- Хранение объектов в глобальной области видимости, или в родительских, где это не нужно. В таком случае, она не может очиститься.
- Считывание файла в память, вместо того, чтобы использовать стримы
- listeners которые слишком часто вызываются, могут засорять память
- Функция render вызывается часто, и код в ней может заполнять память.
Что такое Callback?
Это функция, которую мы передаем в другую функцию в качестве аргумента, чтобы получить асинхронный результат. Наш коллбэк получит в качествепервого аргумента ошибку если она есть, если нет, то null, а вторым аргументом уже будет результат.
Что такое Promise?
Промисы дает нам удобный интерфейс для работы с асинхронными операциями. Мы можем выстраивать их в цепочку вызовов.Плюс, можно обрабатывать ошибку в цепочке промисов в одном месте.
Их можно чейнить и тогда новый then вернет то, что вернул предыдущий then.
Важно понимать, что вызов функции уже запускает промис, then/catch/await только позволяют нам получить результат.
Promise.all vs Promise.allSettled
Оба запускают промисы параллельно, но .all выпадет в catch если хотябы 1 промис зафейлится. allSettled получит реджекты в then, где в поле status мы сможем это проверить.
Отличие process.nextTick(), setImmediate(), setTimeout(fn, 0)
nextTick не попадает в официально в event loop. Просто запускается сразу после текущего тика. Для них есть специальная очередь.
setImmediate попадает в евент луп в check queue. просто выполняется сразу.
setTimeout(fn, 0) попадает в timer queue, у которой приоритет выше, чем у check queue. Отработает быстрее setImmediate. Не гарантирует точное время выполнения, так как может задержаться в очереди.
Что такое замыкания?
У функции есть своя область видимости (scope), куда записываются переменные, другие функции. Он скрыт от прямого доступа, но из функции можно получить доступ к родительским областям видимости. И даже когда родительская функция уже была вызвана, дочерняя все еще имеет доступ к её переменным.
При запуске функции создается лексическое окружение (LexicalEnvironment) с аргументами, переменными и функциями объявлеными внутри неё. Также у неё есть доступ к объекту [[Scope]] который ведет на родителькую область видимости.
Область видимости переменной
У let, const область видимости блок, тоесть if, for, case с {} и т.д. У var область видимости функция.
Що таке hoisting?
Оголошення функції чи змінної переміщуються інтерпретатором на початок області видимості. let, const — блок, а var — функція.
Присвоювання спрацює тільки там, де воно було описане.
Якщо описати функцію як function name() вона підніметься на початок області видимості, що дозволяє викликати її до місця оголошення.
Які є типи в JS?
Примітивні типи: number (включає NaN), bigint, boolean, string, null, undefined, symbol.
Також є object, який є структурою даних.
Що таке Symbol?
Symbol — це унікальне, незмінне значення, яке використовується як ключ об’єкта, не беручи участі в ітераціях. За його допомогою можна задати спеціальні методи для об’єктів, такі як:
Symbol.iterator — ітерація через for…of;
Symbol.toPrimitive — перетворення до примітиву;
Symbol.toStringTag — результат для toString;
Symbol.asyncIterator — асинхронна ітерація;
Symbol.hasInstance — кастомізований instanceof.
Чем отличается == от ===?
Перший оператор виконує порівняння з приведенням типів, тоді як другий виконує строге порівняння без приведення типів.
WeakMap
WeakMap як ключ може мати лише об’єкти. Він не підтримує ітерацію. Якщо об’єкт, який використовується як ключ, перестає існувати деінде в коді, його більше не буде зберігатися в WeakMap. Це дозволяє йому швидше звільняти пам’ять, оскільки WeakMap не перешкоджає видаленню об’єктів зі сміттєзбирачем.