JS (Part 1) Flashcards

1
Q

Объекты

Обращение к несуществующему свойству объекта.

A

Особенность JavaScript-объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует – ошибки не будет!

В таком случае, возвращается undefined.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Объекты

Способы проверки сущеcтвования свойств объекта.

A

2 основных способа:
1. Сравнение с undefined (===);
2. Использовать оператор in (“key” in obj)
3. Использовать свойств о Object.hasOwn(obj, prop)

Помним, что при сравнении, есть особый случай. Если свойство существует и его значение - undefined, то логика ломается.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Объекты

Упорядоченные свойства объекта.

A

При переборе свойств объекта, нельзя быть увереным, что порядок будет сохранен. Поэтому если порядок важен, объект как структура данных не подходит.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Переменная и объект.

A

Переменная хранит не значение объекта, а ссылку. То есть адрес в памяти на это значение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Поверхностная копия и глубокая копия объекта.

A

Для поверхностной копии объекта можно использовать простой цикл или встроенную функцию Object.assign(dest, [ob1, obj2, …]);

Для глубокой копии объекта можно использовать цикл с рекурсией, либо функцию из библиотеки lodash: _.cloneDeep(obj).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Общепринятое название функций объекта.

A

Функции объекта в языке JS принято называть методами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Сокращенная запись метода в объекте.

A

user = {
sayHi() {
console.log(“Hi”);
}
};

Вместо: sayHi: function() { … };

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Момент определения значения this.

A

Значение this определяется во время исполнения кода. Нужно просто понимать, что значение не фиксировано.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Функция-конструктор. Что это ? Что происходит при вызове ? Зачем ?

A

Функция-конструктор технически обычная функция, но существует два соглашения:
1. Имя функции-конструктора должно начинаться с большой буквы;
2. Функция-конструктор должна выполняться только с помощью оператора “new”.

Когда функция-конструктор вызывается, происходят следующие вещи:
1. Создается новый пустой объект, и он присваивается this;
2. Выполняется тело функции;
3. Возвращается значение this.

Основная цель конструкторов – реализовать код для многократного создания однотипных объектов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Возврат значения из конструктора.

A

Обычно конструкторы не имеют оператора return. Их задача – записать все необходимое в this, и это автоматически становится результатом.

Но если return всё же есть, то применяется простое правило:

  • При вызове return с объектом, вместо this вернётся объект.
  • При вызове return с примитивным значением, оно проигнорируется.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Опциональная цепочка. Что это ? Варианты использования.

A

Опциональная цепочка ?. останавливает вычисление и возвращает undefined, если значение перед ?. не определено.

Что-то определено или существует, если оно не является null и не undefined.

Синтаксис опциональной цепочки ?. имеет три формы:
1. obj?.prop
2. obj?.[prop]
3. obj.method?.()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какими типами могут быть ключи у объекта ?

A

По спецификации, в качестве ключей для свойств могут использоваться только строки или символы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Почему вообще существуют примитивные типы, когда можно вообще все сделать объектом ?

A

Объекты “тяжелее” примитивов. Они нуждаются в дополнительных ресурсах для поддержания внутренней структуры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Примитив как объект.

A

Есть множество действий, которые хотелось бы применять к примитивным типам. Но примитивы должны оставаться легкими и быстрыми насколько это возможно.

Тогда был придуман механизм “объект-обертка”.

Его суть в том, что примитивы остаются примитивами, но язык позволяет осуществлять доступ к методам и свойствам примитивных типов за счет того, что в момент обращения к этим свойствам JS автоматически оборачивает примитив в обертку, вызывает метод и удаляет специальный объект, возвращая обычное значение.

Методы обертки есть у каждого типа кроме null и undefined.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Проверка: ifFinite и isNan.

A

Infinity и NaN - это числовые значения, которые принадлежат типу number. Но они не являются обычными числами, поэтому есть функции для их проверки.

isNaN(value) - преобразует значение в число и проверяет является ли оно NaN.
Нужно помнить что === NaN не сработает, так как NaN уникально тем, что оно не равно ничему даже самому себе.

isFinite(value) - проверяет содержится ли в строке число. Вернет true всегда, если значение не infinity/-infinity или не число.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

parseInt(str, base) и num.toString(base)

A

parseInt(str, base) преобразует строку в целое число в соответствии с указанной системой счисления;

num.toString(base) представляет число в строковом виде в указанной системе счисления base.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Функции, которые используются для округления в JS.

A
  1. Math.floor(value) - округление в меньшую сторону;
  2. Math.ceil(value) - округление в большую сторону;
  3. Math.trunc(value) - удаление дробной части без округления;
  4. Math.round(value) - округление до ближайшего целого;
  5. num.toFixed(precision) - округляет число до n знаков после запятой и возвращает строковое представление результата.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

В каком формате кодируются строки в JS ? Методы работы с этим форматом.

A

В JS строки кодируются только в формате UTF-8.

str.codePointAt(pos) - получение кода в UTF-16.

String.fromCodePoint(code) - получение символа по коду.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Зачем нужен массив, если есть объект.

A

Польза от массива появляется тогда, когда нам необходимо хранить упорядоченные коллекции.

20
Q

Какие типы элементов могут храниться в массиве ?

Новый способ получить последний элемент массива.

A

В массиве могут храниться элементы любого типа.

Для получения последнего элемента массива был введен новый и удобный метод at.
fruits.at(-1);

21
Q

Что такое массив относительно объекта ?

A

Массив - это особый подвид объектов. Квадратные скобки, используемые для того, чтобы получить доступ к свойству - это по сути обычный синтаксис доступа по ключу.

Массивы расширяют объекты, так как предусматривают специальные методы для работы с упорядоченными коллекциями данных, а так же свойство length.

22
Q

Метод splice.

A

Метод, который лучше slice. Работает с массивами.
Позволяет удалять и добавлять элементы.
А также извлекать удаленные элементы.

23
Q

Symbol.isConcatSpreadable: true

A

Данное свойство применяется к массивоподобным объектам, для того, чтобы при использовании метода concat,объект можно было обработать как массив.

const obj = {
0: ‘Nastya’,
1: 12,
[Symbol.isConcatSpreadable]: true,
length: 2,
};

24
Q

Зачем нужен Array.isArray(value)

A

Массивы не образуют отдельный тип языка. Они основаны на объектах.

Поэтому typeof не может отличить простой объект от массива.

Поэтому существует такой метод, который позволяет проверить является ли значение массивом.

25
Q

Перебираемые объекты.

A

Перебираемые (или итерируемые) объекты - это обобщение массивов. Концепция, которая позволяет использовать любой объект в цикле for…of.

Конечно же, сами массивы являются перебираемыми объектами. Но есть и много других встроенных перебираемых объектов, например, строк.

Если объект не массив, но это коллекция, то можно легко сделать такой объект пригодным для перебора через for…of.

Все упирается в добавление в объект метода с именем Symbol.iterator.

26
Q

В чем разница между итерируемыми объектами и псевдомассивами ?

A

Итерируемые объекты - это объекты, которые реализуют метод Symbol.iterator.

Псевдомассивы - это объекты, у которых есть индексы и свойство length, то есть, они выглядят как массивы.

27
Q

Array.from

A

Это универсальный метод, который принимает итерируемый объект или псевдомассив и делает из него настоящий Array.

28
Q

Отличие Map от Object.

A

Map - это коллекция ключ/значение как и Object. Основное отличие в том, что Map позволяет использовать ключи любого типа,

Так же для записи или доступа к свойствам необходимо использовать set, get и так далее.

Так же стоит учитывать, что в отличие от Object, порядок в Map сохранен.

29
Q

Основные методы Map.
Основные методы перебора Map.

A
  • new Map() – создаёт коллекцию.
  • map.set(key, value) – записывает по ключу key значение value.
  • map.get(key) – возвращает значение по ключу или undefined, если ключ key отсутствует.
  • map.has(key) – возвращает true, если ключ key присутствует в коллекции, иначе false.
  • map.delete(key) – удаляет элемент по ключу key.
  • map.clear() – очищает коллекцию от всех элементов.
  • map.size – возвращает текущее количество элементов.

Методы перебора:
- map.keys();
- map.values();
- map.entries().
- map.forEach();

30
Q

Что такое Set.
Основные методы.

A

Объект Set - это особый вид коллекции: “множество” значений(без ключей), где каждое значение может появляться только один раз,

  • new Set(iterable) – создаёт Set, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новый Set.
  • set.add(value) – добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект set.
  • set.delete(value) – удаляет значение, возвращает true, если value было в множестве на момент вызова, иначе false.

Методы для перебора:
- for…of;
- forEach;
- set.keys();
- set.values();
- set.entries();

  • set.has(value) – возвращает true, если значение присутствует в множестве, иначе false.
  • set.clear() – удаляет все имеющиеся значения.
  • set.size – возвращает количество элементов в множестве.
31
Q

Задача WeakMap

A

Как мы знаем, в JS автоматическая сборка мусора.

Если объект хранится в массива или выступает ключом в какой-то структуре данных, то при удалении данного объекта он будет оставаться в этих структурах.

WeakMap - принципиально другая структура в этом аспекте. Она не предотвращает удаление объектов сборщиком мусора, когда эти объекты выступают в качестве ключей.

32
Q

Отличие Map от WeakMap.

Какие методы присутствуют в WeakMap.

A

Первое отличие заключается в том, что ключами в WeakMap могут быть только объекты.

WeakMap не поддерживает перебор и методы keys(), values(), entries().

Только:
- weakMap.get(key);
- weakMap.set(key, value);
- weakMap.delete(key);
- weakMap.has(key).

33
Q

Существуют методы Object.keys, values, entries.
Зачем и почему они существуют.

A

Это методы, которые предназначены для перебора простых объектов.

Они похожи на методы, которые работают с Map, Set, Array.

34
Q

Деструктурирующее присваивание.

A

Это специальный синтаксис, который позволяет нам распаковывать массивы или объекты в несколько переменных, так как иногда они более удобны.

35
Q

Методы для работы с JSON.

Какие форматы поддерживает JSON ?

A
  • JSON.stringify для преобразования объектов в JSON. Такой объект называется сериализованным.
    Переопределить вид вывода можно внутри объекта в метода toJSON() {}.
    Тогда при вызове JSON.stringify этот методы будет вызван автоматически.
  • JSON.parse для преобразования JSON обратно в объект.

JSON работает не только с объектами но и с примитивами:
- объекты;
- массивы;
- числа;
- строки;
- логические значения;
- null

36
Q

Какие свойства пропускает JSON.stringify ?

A
  • Свойства-функции(методы);
  • Символьный ключи и значения;
  • Свойства, содержащие undefined.

Но этот процесс можно перенастроить.

37
Q

Контекст выполнения

A

Это понятие, которое необходимо понимать при разговоре о рекурсии.

Информация о процессе выполнения запущенной функции хранится в ее контекте выполнения.

Контекст выполнения - это специальная внутренняя структура данных, которая содержит информацию о вызове функции. Она включает в себя конкретное место в коде, на котором находится интерпретатор, локальные переменные функции, значение this и прочую служебную информацию.

38
Q

Что такое лексическое окружение ?
Глобальное окружение.
Изменение переменной.

A

Лексическое окружение - это внутренний (скрытый) объект, который связан с выполняемой функцией, блоком кода или скриптом. (LexicalEnvironment).

Объект лексического окружения состоит из двух частей:
- Environment Record - объект, в котором как свойства хранятся все локальные переменные.
- Ссылка на внешнее лексическое окружение - то есть то, которое соответствует коду снаружи (снаружи от текущих фигурных скобок).

Переменная - это просто свойство специального внутреннего объекта.

У глобального лексического окружения нет внешнего окружения, так как она указывает на null.

Когда внешняя переменная модифицируется, она изменится там, где была найдена.

39
Q

Лексическое окружение функций. Когда создаются и сколько раз.

A

Новое лексическое окружение функции создается каждый раз, когда функция выполняется.

Если функция вызывается несколько раз, то для каждого вызова будет свое лексическое окружение, со своими, специфичными для этого вызова, локальными переменными и параметрами.

Все функции “при рождении” получают скрытое свойство [[Environment]], которое ссылается на лексическое окружение места, где они были созданы.

40
Q

Что такое замыкание в JS ?

A

Замыкание - это функция, которая запоминает свои внешние переменные и может получить к ним доступ.

В JS все функции являются замыканиями. Потому что они автоматически запоминают, где были созданы, с помощью срытого свойства [[Environment]], и все они могут получить доступ к внешним переменным.

41
Q

Просто посмотреть: важная задача про замыкание и метод filter.

A

let arr = [1, 2, 3, 4, 5, 6, 7];

const inBetween = (min, max) => {
return (x) => x >= min && x <= max;
};

const inArray = (values) => {
return (x) => values.includes(x);
};

console.log(arr.filter(inBetween(3, 6)));
console.log(arr.filter(inArray([1, 2, 10])));

42
Q

Отличия var от let/const.

A

Существует 2 основных отличия:
- Переменные var не имеют блочной области видимости, они ограничены, как минимум, телом функции.

  • Объявления (инициализация) переменных var производится в начале исполнения функции (или скрипта для глобальных переменных).
43
Q

Что из себя представляет глобальный объект ?

A

Глобальный объект хранит переменные, которые должны быть доступны в любом месте программы.

Глобальный объект имеет универсальное имя - globalThis.
Но чаще всего на него ссылаются по-старому, используя имя, характерное для данного окружения, такое как window или global.

44
Q

Что следует из того, что функция - это объект ?

A

Это значит, что у функции есть свойства:
- func.name (имя функции);
- func.length (количество аргументов);
- Так же пользовательские свойства, которые мы можем объявить сами, нужно помнить, что такие свойства это не переменные.

45
Q

Синтаксис new Function.
В чем отличие такой функции от обычного объявления.

A

let func = new Function([ arg1, …argN], functionBody);

Главное отличие в лексическом окружении, такие функции имеют [[ Environment ]], ссылающийся только на глобальное лексическое окружение, неважно где была объявлена функция.