javascript Flashcards
Какие типы данных присутствуют в JavaScript?
Существует 8 типов данных. 7 примитивных и 1 сложный тип данных. Примитивные типы: number, string, boolean, symbol, bigInt, null, undefined. Сложный тип - object. Он используется для коллекций данных и для объявления более сложных сущностей. Также он передается по ссылке, а простые типы данных по значению
Что такое NaN?
Глобальное свойство NaN является значением, представляющим не-число (Not-A-Number). Его тип данных number. NaN не равен самому себе. Проверку на NaN можно сделать с помощью Number.isNaN(значение)
В чем разница между null и undefined?
undefined (неопределенный) представляет собой значение по умолчанию:
1 - переменной, которая обьявлена без инициализации;
2 - функции, которая ничего не возвращает явно;
3 - несуществующего свойства объекта.
null - это значение «отсутствия значения». Присваивается переменной явно.
Чем отличается строгое и не строгое равенство (=== и ==)?
Строгое сравнивает значения по типу данных и значению
Не строгое приводит значения к одному типу а потом эти значения сравнивает.
Почему результатом сравнения двух похожих объектов является false?
Потому что объекты - это ссылочные типы данных. 2 одинаковы с виду объекта имеют разные ссылки, и поэтому операция сравнения будет возвращать false.
Как проверить 2 объекта на идентичность?
1 - использовать JSON.stringify для приведения объектов в строку и сравнить их уже как 2 строки. Такой подход имеет ограничения. Если в объекте будут методы или symbol - JSON.stringify не сможет конвертировать их в строку.
2 - написать или использовать из библиотеки функцию deepEqual которая будет проходить циклом по ключам двух объектов и будет проверять значение этих ключей. Функция должна работать рекурсивно.
Как сделать копию объекта?
Существует понятие глубокого и поверхносного копирования. Глубокое - это копирование объекта и все его уровней вложенности. Поверхносное - это коприрование только первого уровня вложенности, а для остального копируется ссылка.
Способы поверхностого копирования:
1 - использовать spread оператор (…)
2 - использовать Object.assign()
Способы глубокого копирования:
1 - использовать JSON.stringify - JSON.parse для конвертирования объектва в строку и потом обратно. Имеет ограничения по копированию методов и symbols
2 - написать или использовать из библиотеки функцию deepClone которая будет рекурсивно проходить по ключам объекта и копировать их в новый объект
Чем отличаются переменные var, let и const?
“var - переменную можно объявить после инициализации, можно изменять, имеет функциональную область видимости, имеет hoisting. Сейчас почти не используют при написании нового кода
let - переменную можно инициализировать после обьявления, можно изменять, имеет блочную область видимости, не имеет hoisting
conts - переменную обязательно нужно инициализировать во-время объявления, нельзя изменять, имеет блочную область видимости, не имеет hoisting
Как узнать является ли объект массивом?
Для этого можно использовать метод Array.isArray().
Какие перебирающие методы массивов вы знаете?
Есть следущие методы:
- forEach – для перебора массива.
- filter – для фильтрации массива.
- every – для проверки массива.
- map – для трансформации массива в массив.
- reduce/reduceRight – для прохода по массиву с вычислением значения.
- sort - сортирует массив
- find/findLast/some/findIndex/findLastIndex
Как объединить массивы?
1 - Можно использовать метод concat()
2 - Можно использоваться оператором spread и распылить эти массив в 1 один общий массив
Как узнать находится ли элемент в массиве?
1 - Использовать метод includes, который возвращает true если элемент находиться в массиве
2 - Использовать метод indexOf/lastIndexOf который возвращает индекс найденного элемента в массиве или -1 если элемента в массиве нет
Что такое поднятие (hoisting) ?
Это механизм в JavaScript, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен. Поднимаются переменные var и function declaration
Каким будет значение переменной var при обращении к ней до ее объявления?
undefined
Что будет если обратится к переменной let/const до её объявления?
Будет ошибка типа ReferenceError. Cannot access ‘variable’ before initialization
Що таке область видимості (Scope)?
Це частина програми, в межах якої можна отримати доступ до певних змінних.
Іншими словами, вона визначає видимість змінної.
JS має 6 типів областей видимості: глобальна, модульна, функціональна, Eval, блочна (ES6), лексична области видимості.
Чем Function Declaration отличается от Function Expression?
Function Expression создаётся, когда выполнение доходит до него, и затем уже может использоваться.
Function Declaration создается до выполнения кода scope где она была объявлена. И может быть использована во всем этом scope.
Чем стрелочная функция отличается от обычной?
1 - Стрелочная функция получает this в момент создания из родительского this. В обычной функции this устанавливается во время вызова из контеста вызова.
2 - Стрелочная функция не имеет arguments.
3 - Стрелочная функция не имеет свойства prototype.
4 - Стрелочная функция имеет короткий синтаксис не явного возврата значения.
Есть ли аналог arguments для стрелочной функции?
Можно использовать rest оператор (…) для того, чтобы собрать все аргументы с которыми вызвана функция в массив.
Что такое лексическое окружение (Lexical Environment)?
Лексическое окружение в JavaScript — это комбинация текущей области видимости и ссылки на внешнее лексическое окружение.
Внешнее лексическое окружение — это окружение з текущей областью видимости в которой функция была объявлена, и она позволяет функции обращаться к переменным и функциям, определенным в этой внешней среде.
Что является глобальным лексическим окружение?
window
Что такое замыкание (Closures)?
Замыкание - это возможность функции использовать переменные из ее лексического окружения в котором она была объявлена.
Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт доступ фунции к внешнему лексическому окружению. В итоге по цепочке ссылок на родительское лексическое окружения фунция имеет доступ ко всем лексическим окружениям своих предков. В JavaScript замыкания создаются каждый раз при создании функции, во время её создания.
Это способность функции во время создания запоминать ссылки на переменные функции и параметры, находящиеся в текущем лексическом окружении, а так же в лексическом окружении родительской функции и так до глобальной области видимости. Замыкание подразумевает именно внешние переменные, а не саму функцию.
or
Это способность функции запоминать окружение (значения переменных окружения) в котором она была определена.
Для чего используют замыкания?
1 - Часто для создания приватных переменных и функций (инкапсуляция).
2 - Для сохранения промежуточных параметров вызова функции (каррирование).
3 - Мемоизация функции.
Что такое IIFE?
Immediately Invoked Function Expression - это функция, которая вызывается или выполняется сразу же после создания или объявления.
Что такое this?
this - это ключевое слово в js, значение которого формируется по определенным правилам.
В ES5 - это ссылка на контекст вызова функции (обычной). Контекстом является объект который в данный момент вызывает функцию.
В ES6 - может быть любым значением.
Для стрелочной функции - это this лексического окружения.
1 - this в объекте - указывает на сам объект
2 - this в классе - указывает на экземпляр класса
3 - глобальным контекстом является window (или undefined в режиме use strict)
4 - call, apply, bind задают произвольный this обычной функции.
Как можно задать контекст вызова функции?
Задать this можно только единожды.
В следующих случаях контекст вызова не сработает:
1. На стрелочную функцию не действуют (bind, call, apply)
2. На функцию, которую возвращает bind не действуют (call, apply)
3. После применения call || apply
Можно ли изменить контекст функции которую возвратил метод bind?
Нет. Однажды назначив функции this изменить его уже нельзя.
Можно ли подменить контекст вызова стрелочной функции?
Нет. Однажды назначив функции this (у стрелочной - это во время ее объявления) изменить его уже нельзя.
Что такое прототип объекта?
Это родительский объект от которого был унаследован текущий объект.
Как работает прототипное наследование в JS?
Когда мы хотим прочитать свойство из объекта, а оно отсутствует - JS попытается его прочитать из прототипа объекта. Если свойства нет в прототипе, JS попытается его прочиться из прототипа прототипа, и т.д. до тех пор, пока свойство не будет найдено или цепочка прототипов не закончится. JS возвратит либо значение найденного свойства либо undefined.
Как создать объект в котором не будет прототипа?
Использовать Object.create(null). Данный метод принимает первым аргументом объект, который будет являться прототипом объекта, который он возвратит. Если мы вызовем Object.create() c аргументом null, будет создан объект без прототипа
Як перевірити чи є властивість об’єкту особистою властивістю чи це властивість прототипа?
Можно использовать метод obj.hasOwnProperty(prop) который возвращает булевое значение.
Как запретить изменять объект?
Есть метод Object.freeze(), который “замораживает” объект от изменений. Данный метод работает только в одну сторону. Отменить действие данного метода уже невозможно.
Eсть метод Object.seal(), который запечатывает объект, предотвращая добавление новых свойств к объекту и делая все существующие свойства не настраиваемыми. Значения текущих свойств остаются изменяемыми.
Так же есть метод Object.preventExtensions(), который запрещает добавлять новые свойства в объект.
Что такое дескрипторы свойства объекта?
Дескриптор - это объект конфигурации свойства в объекте. Он имеет 4 свойства:
configurable - указывает можно ли добавлять, удалять или изменять свойство объекта
enumerable - указывает буде ли видно свойство во время перебора свойств объекта
value - значение свойства объекта.
writable - указывает можно ли изменять значаение данного свойства
get - Функция, используемая как геттер свойства
set - Функция, используемая как сеттер свойства
Чем отличается функция конструктор и класс?
Класс - это синтаксический сахар над функцией конструктором. При создании экземпляра класса, методы описанные в нем попадают в прототип, а методы описанные внутри функции конструктора попадут в сам экземпляр. Для того, чтобы методы описанные внутри функции конструктора попали в прототип их нужно отдельно туда добавить.
Что нужно сделать, чтобы метод класса попал в его экземпляр?
- Такой метод нужно описать внутри конструктора
- Задать свойство-функцию методом выражения (foo = function(){})
Присутствует ли в JS множественное наследование?
Нет. Так как наследование в JS базируется на прототипах, у одного объекта может быть только 1 прототип.
Что такое Promise?
Это объект который используется для отложенных и асинхронных вычислений. Promise имеет 3 состояния:
- ожидание (pending): начальное состояние, не исполнен и не отклонён.
- исполнено (fulfilled): операция завершена успешно.
- отклонено (rejected): операция завершена с ошибкой.
Для чего нужен метод Promise.all?
Метод Promise.all(iterable) возвращает промис, который выполнится тогда, когда будут выполнены все промисы, переданные в виде перечисляемого аргумента, или отклонено любой первый из переданных промисов.
Возвращает промис, который будет выполнен когда будут выполнены все промисы, переданные в виде перечисляемого аргумента, или отклонён, если будет отклонено хоть одно из переданных промисов
У него есть аналог Promise.allSetled, который исполняется как-только все полученные промисы завершены (исполнены или отклонены), содержащий массив результатов исполнения полученных промисов.
Для чего нужен метод Promise.race?
Ожидает исполнения или отклонения любого из полученных промисов. Возвращает промис, который будет исполнен или отклонен с результатом исполнения первого исполненного или отклоненного промиса.
Для чего нужен синтаксис async/await?
Ключевое слово async делает созданную функцию асинхронной.
Асинхронная функция может содержать ключевое слово await, которое приостанавливает выполнение асинхронной функции и ожидает ответа от переданного Promise, затем возобновляя выполнение функции async и возвращая полученное значение.
Как обрабатывать ошибки в async/await функции?
Для этого можно использовать конструкцию try…catch()
Що таке event loop?
Це механізм, який відповідає за виконання коду, збору та обробки подій. В концепції event loop є 4 блоки:
- call stack - відповідає за створення контексту виконання функії. Кожна викликана функція попадає в call stack. Працює за методом LIFO (англ. Last In, First Out — останній прийшов, перший пішов)
- heap - це велика неструктурована область пам’яті, в котрій зберегаються оголошені змінні
- third party API - це API, котре надає оточення. Наприклад, метод fetch, котрий надається браузером.
- queue - черга завдань, які повинні бути оброблені. Кожна задача ассоціюється з деякою функцією, котра буде викликана, щоб обробити цю задачу. Працює за принципом FIFO (First In, First Out — перший прийшов, перший пішов).