JavaScript Flashcards

1
Q

Что такое Websokets?

A

Websokets - это протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером.

В отличие от HTTP, котором общение идёт в формате запрос-ответ - при использовании websokets возможно установить соединение и затем получать полезные данные в виде ответов от сервера. Отправлять данные от себя так же возможно в любой момент.

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

Отладка в браузере, debugger

A

Можно запустить с помощью добавления строчки debugger или вручную выбрав файл в Chrome.

В отладке можно определить точки остановки, пошагово выполнять код и видеть все текущие переменные.

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

Паттерны JS (декоратор)

A

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

В качестве аргумента принимает декорируемый объект.
Возвращает новый объект, который содержит в себе старый объект + дополнительный функционал.

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

Паттерны JS (модуль)

A

Модуль - отдельный файл, из которого возможно выполнить экспорт.

Коротко:
экспорт
- до объявления
- отдельно от объявления
- с другим именем
- по умолчанию
- по умолчанию с другим именем
импорт
- нескольких объектов в одном с деструктуризацией
- с изменением имени
- всего в одном объекте
- по умолчанию

export
1. экспорт до объявления (конкретной переменной, функции или класса):
export const bullet = 'a'
2. экспорт отдельно от объявления (нескольких значений в объекте):
const a = 1
const b = 2
export {a, b}
3. возможно эскортировать под другим именем
export {a as alpha, b as beta}
4. экспорт по умолчанию (может быть только один)
export default class User {…}

import
1. импорт нескольких объектов (возможно с заменой имени)
import {a, b as beta} from file.js
2. импорт всего в одном объекте
import * as abc from file.js
3. импорт по умолчанию
import abc from file.js

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

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

Generators.
Что такое генераторы?

A

Генераторы могут по мере необходимости возвращать множество значений одно за другим.
Их особенность является в том, что выполняясь они могут остановить своё исполнение, вернуть промежуточное значение, а затем продолжить выполняться.

  • Функции-генераторы объявляются с помощью function*.
  • Оператор yield используется для приостановки выполнения функции-генератора и возврата значения вызывающему коду. Выполнение функции можно возобновить с помощью метода next().
  • Генератор возвращает объект итератор, который можно использовать для обхода значений, генерируемых функцией.

Определение генератора:

function* simpleGenerator() {
    yield 1;
    yield 2;
    yield 3;
}

Использование генератора:

const generator = simpleGenerator(); // итератор
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

“use strict”

A

Строгий режим
Активируется если первой строкой написать “use strict” (можно в файле, можно только в функции).

Заставляет работать код только в современном режиме, убирает обратную совместимость с очень старым кодом.

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

Объясните делегирование событий.
Когда стоит его использовать?
Какие плюсы от этого?

A

Это обработка события для множества элементов одним из родителей элементов (общим предком).

Ставится один обработчик на общего предка. А в нём определяем нужный элемент через event.target.

Экономит память, удобство изменения, меньше кода (не надо каждый раз ставить и снимать обработчик для каждого элемента).

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

Что такое IIFE (ифи)?

A

Immediately Invoked Function Expression - немедленно вызываемая функция.

(function () {
  console.log('Hello World');
})();

Такое выражение выполняется немедленно после создания.

До появления ES6 модулей - использовалось что бы не загрязнить глобальное пространство имён. Переменные объявленные внутри - не видимы за его пределами.

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

Объясните, почему это не является IIFE: function foo(){ }();. Что необходимо изменить, чтобы это стало IIFE?

A

Не хватает скобок вокруг функции, что бы скобки в конце считались указанием к исполнению функции: (function foo(){ })().

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

В каких случаях обычно используются анонимные функции?

A

Для выполнения какого-то кода в коллбэках, где не нужно создавать отдельную именную функцию под это действие.

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

В чём различие между переменными, значение которых: null, undefined? Как бы вы проверили их на каждое из этих значений?

A

undefined - переменная, которая была объявлена, но у неё нет значения или результат выполнения функции, которая ничего не возвращает.

null - значение, которое явно обозначает отсутствие значения.

Проверить можно с помощью typeof или строгим равенством ===.

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

Можете ли вы описать основное различие между циклом .forEach() и циклом .map()? И в каких случаях каждый из них используется?

A

map
- коллбек выполняется для каждого элемента массива
- результат выполнения становится элементом массива
- возвращает новый массив

forEach
- коллбек выполняется для каждого элемента массива
- результат выполнения никуда не запишется
- возвращает undefined

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

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

A

host-объекты - это объекты, которые предоставляются средой выполнения. То есть в нашем случае браузером: window, document, location, history итд.

нативные объекты - это объекты, которые являются частью языка Java Script: String, Array, Math, Object, Function итд.

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

В чем разница между:
function Person(){}
var person = Person()
var person = new Person()

A

function Person(){} - создание функции с именем Person.
var person = Person() - вызов функции Person и помещение результата в переменную person.
var person = new Person() - создание нового объекта, используя функцию-конструктор Person.

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

Подробно расскажите об Ajax.

A

Asynchronous Javascript And Xml - технология обращения к серверу без перезагрузки страницы. Использовать XML не обязательно, под AJAX подразумевают любое общение с сервером без перезагрузки страницы, организованное при помощи JavaScript.

Плюсы:

  • Повышение интерактивности - новые данные с сервера можно добавить динамически без перезагрузки страницы
  • Скрипты и стили надо скачать всего 1 раз для страницы

Минусы:

  • Сложность реализации закладки для страницы
  • Не работает без JS
  • Динамический контент не виден некоторым роботам.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Вы когда-нибудь использовали шаблонизацию на JavaScript? Если да, то какие библиотеки вы использовали?

A

Стандартный <template> и JSX.

Содержимое шаблона доступно по его свойству content в качестве DocumentFragment – особый тип DOM-узла.

Например:
const tmpl = document.querySelector('#text-template').content;
let elem = document.createElement('div');
// Клонируем содержимое шаблона для того, чтобы переиспользовать его несколько раз
elem.append(tmpl.content.cloneNode(true));

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

Расскажите, что такое поднятие (hoisting).

A

Hoisting - поднятие переменной. Это поведение переменных, объявленых с помощью var.

Переменные объявленные с var - поднимаются в верхнюю часть текущей области, что позволяет к ним обращаться. Поднимается только объявление. Присвоение остаётся на своём месте. Это значит что до присвоения значения этой переменной - она будет равняться undefined.

В случае попытки провернуть такое с let или const - будет ошибка reference error.

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

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

Объясните, что такое всплытие событий (event bubbling).

A

Это одна из фаз прохода события.

После срабатывания события на целевом элементе - событие “проходит” по всем родительским элементам. На этом механизме основано делегирование событий.

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

В чём разница между “атрибутом” (attribute) и “свойством” (property)?

A

Атрибуты - в разметке HTML.
Свойства - у объектов DOM.

Большинство стандартных HTML-атрибутов становятся свойствами соответствующих объектов.

Нестандартные атрибуты надо записывать в dataset-*.

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

Почему не следует расширять нативные JavaScript-объекты?

A

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

Единственное оправданное расширение нативного объекта - создание полифила для устаревшего браузера.

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

В чём разница между == и ===?

A

=== - строгое равенство. Сравнивает значение и тип

== - не строгое равенство. Сравнивает только значение. Могут быть неявные преобразования

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

Объясните Same Origin policy в контексте JavaScript.

A

Политика одного источника.
- Ограничивает доступ из js к localStorage и cookies, которые были получены с другого домена.
- Запрещает ajax запросы на другие домены, если на этих доменах не настроен CORS соответсвующим образом.
- Скрипт с одного домена не может манипулировать элементами DOM другого домена. Например, iframe с example.com не может изменять содержимое iframe с another-domain.com.

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

Сделайте так, чтобы этот код работал:
duplicate([1,2,3,4,5])
результат:
[1,2,3,4,5,1,2,3,4,5]

A
function duplicate(arr) {
 return arr.concat(arr)
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Почему тернарный оператор так называется?

A

“Тернарный” означает три.
Троичное выражение принимает три операнда: условие, выражение then и выражение else.

условие ? выражение1 : выражение2

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

Напишите цикл, который перебирает числа до 100, возвращая “fizz” на числа кратные 3, “buzz” на числа кратные 5 и “fizzbuzz” на числа кратные 3 и 5

A
for (let i = 0; i <= 100; i++) {
  if (i % 3 === 0 && i % 5 === 0) {
    return "fizzbuzz"
  } else if (i % 3 === 0) {
    return "fizz"
  } else if (i % 5 === 0) {
  	return "buzz"
  }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Что такое промисы (Promises)?

Что может вернуть?
В каком стоянии может быть?
Как создаётся промис?
Как завершить промис?
Через какую очередь идёт обработка промиса?

A

Промисы это один из приёмов работы с асинхронным кодом в JS.

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

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

Промис создаётся через конструктор new Promise(function(resolve, reject) { … }).

Функция внутри - зовётся исполнитель (executor), после создания он автоматически сразу запускается.

resolve и reject - коллбеки, которые предоставляет JS, принимают 1 аргумент, остальные игнорируются.

В промисе обязательно должен быть выполнен resolve или reject.

resolve - выполняется при успешном завершение, в аргумент передаётся результат. Выполнение resolve не прерывает выполнение функции-исполнителя.

reject - выполняется в случае ошибки, в аргумент можно передать что угодно, но лучше передавать объект ошибки.

Обработка промисов всегда асинхронная, т.к. все действия промисов проходят через «очередь микрозадач».

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

Как обработать результат выполнения промиса (цепочка промисов)?

A

Цепочка промисов - благодаря тому что промис вернёт новый промис, то методы можно вызывать по цепочке. Таким образом можно строить цепочки из асинхронных действий.

then, catch и finally - методы объекта Promise.

then(f (result) {...} [, f (err) {...}]) - аргументы это функции. Первая выполняется при статусе промиса “выполнено успешно”, вторая при статусе промиса “выполнено с ошибкой”. Сами функции получают в качестве аргумента значение свойства result (аргумент resolve или reject). Второй аргумент не является обязательным.

catch(f (err) {...}) - это сокращённый вариант then(null, f (err) {...})

finally(f () {…}) - будет выполнен в любом случае и не имеет аргументов. Пропускает результат или ошибку через себя к последующим обработчикам. Не должен ничего возвращать, поэтому у finally игнорируется возвращаемое значение.

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

Как обработать ошибку в промисе?

A

Если промис завершается с ошибкой (reject) или во время выполнения получается ошибка, то управление переходит в ближайший обработчик ошибок catch. Это работает как невидимый try…catch внутри промиса и обработчиках.

Если внутри catch произошла ошибка - она перейдёт к следующему catch. Если его нет, то будет проброс исключения.

Ошибку, которая вылетела в глобальное окружение можно поймать используя событие unhandledrejection и addEventListener по этому событию.

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

Какие преимущества и недостатки при использовании промисов вместо колбэков (callbacks)?

A
  • Помогает избежать “callback hell”, который может быть нечитаемым.
  • Упрощает написание последовательного удобочитаемого асинхронного кода с помощью then().
  • Упрощает написание параллельного асинхронного кода с помощью Promise.all().
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Каковы преимущества и недостатки написания JavaScript-кода на языке, который компилируется в JavaScript?

A

Плюсы:

  • Исправляют проблемы JS
  • Синтаксический сахар (более короткий код)
  • Добавление статической типизации

Минусы:

  • Нужна компиляция кода в JS
  • Могут быть трудности с отладкой, если карты кода плохо сопоставляются с исходным кодом
  • Если язык редкий, то могут быть сложности с набором команды
  • Меньшее сообщество, что значит меньше учебных материалов и инструментов
  • Может не быть поддержки в IDE
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Какие инструменты и методы вы используете при отладке кода?

A

React и Redux:

  • React Devtools
  • Redux Devtools

JavaScript:

  • Chrome Devtools
  • Отладка при помощи console.log
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Какие языковые конструкции вы используете для итерации по свойствам объекта и элементам массива?

A

Циклы for..in и for..of, метод .forEach().

Для объектов можно сначала получить все ключи, значения или пары в массив через .keys(), .values() или .entries().

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

Объясните разницу между синхронными и асинхронными функциями.

A

Синхронные функции являются блокирующими. Когда интерпретатор натыкается на такую функцию - он блокирует дальнейшее выполнение операций прежде чем данная функция будет выполнена.

Асинхронные функции не блокируют процесс выполнения скрипта.

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

Что такое цикл событий (event loop)?

A

Event loop - не является частью движка JS и предоставляется средой, например браузером.

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

  1. Проверяется стек вызова и выполняются все задачи из него.
  2. Проверяется очередь задач, берётся маркозадача из очереди, помещается в стек вызова и выполняется.
  3. Выполняются все микрозадачи.
  4. Повторяем.

Очередь вызовов (task queue) - очередь в которую попадают макрозадачи на исполнение из Web API.

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

Разница между микро и макро задачами в event loop?

A

Макрозадачи (tasks):
- выполнение внешнего скрипта после его загрузки
- генерация событий пользовательского ввода и загрузки ресурсов (например движения мыши) и исполнение их обработчиков
- setTimeout

Микрозадачи (jobs)
- промисы
- queueMicrotask(func).

Выполнение всех микрозадач за один раз - гарантирует им общее окружение.

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

Расскажите о queueMicrotask

A

queueMicrotask(func)
Это метод, который используется для создания микрозадачи. Все микрозадачи исполняются после того как стек вызова очищается и до того как берётся новая задача из очереди событий.

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

В чём различие между переменными, созданными при помощи let, var и const?

A

var подвержена всплытию (hoisting) и имеет функциональную область видимости (ну или глобальная, если вне функции).

const и let - блочная область видимости.

const нельзя изменить, let возможно изменить.

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

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

A

Функция высшего порядка - любая функция, которая принимает одну или несколько функций в качестве аргументов и/или возвращает функцию в качестве результата.

Функции первого порядка - не принимают другие функции в качестве аргументов и не возвращают функции в качестве результатов.

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

Что такое деструктуризация?
Можете ли вы привести пример деструктуризации объекта или массива?

A

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

const rgb = [255, 200, 0]
const [red, green ,blue] = rgb;
const student = {
  firstname: 'Glad',
  lastname: 'Chinda',
  country: 'Nigeria'
}
const { firstname, lastname, country } = student;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Шаблонные строки (или шаблонные литералы - Template Literals) в ES6 намного упрощают создание строк, можете ли вы привести пример их использования?

A

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

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

В чём преимущества использования spread оператора и чем он отличается от rest оператора?

A

Spread - распаковывает массив или объект.

Rest - собирает “остальные” аргументы в массив.

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

Каким образом можно обмениваться кодом между файлами?

A

Использовать export + import.

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

Объясните разницу между <script>, <script async> и <script defer>.

A

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

script - загружается и выполняется немедленно, блокируя парсинг HTML

async - загружается асинхронно, выполняется сразу

defer - загружается асинхронно, выполняется после парсинга HTML

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

Типы данных в JavaScript?

A

Восемь основных типов.

string

number

bigInt

boolean

simbol

null

undefined

object

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

Разница между function declaration и function expression?

A

function declaration
function sum(a, b) {...}

function expresion
const sum = function(a, b) {...}

function declaration может всплывать, а значит этой функцией можно воспользоваться до её объявления.

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

Типы таймеров в JavaScript?

A

setTimeout(func, время) - вызывает функцию один раз через “время”

setInterval(func, время) - вызывает функцию периодически через “время”

обе функции возвращают ID таймера для его удаления через clearInterval(id)

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

Что такое область видимости (Scope)?

A

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

Есть три типа областей - глобальная, функциональная или локальная и блочная (внутри {}).

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

Как превратить любой тип данных в булевый?
Перечислите ложные значения в JS.

A

Boolean(значение)
!!значение
if (значение)

Ложные значения: 0, null, undefined, NaN, false

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

Методы строк в JavaScript?

A

str.length - число, длина строки

str.charAt(1) и str[1] - строка, буква в этом индексе (на несуществующий индекс .charAt() вернёт пустую строчку, а скобки [] - undefined)

str.toUpperCase и str.toLowerCase - перевод в большие или маленькие буквы

str.indexOf(’a’) и str.lastIndexOf(’a’) - число, индекс указанного текста

str.slice(0, 3) и str.substring(0, 3) - строка, срез с указанных индексов, но substring не может в отрицательные значения, но может поменять местами аргументы, если начальный индекс больше конечного

str.substr(0, 6) - строка, вырезает “от (0) индекса” и “сколько (6) вырезать”

str.replace(’a’, ‘b’) - строка, заменяет выбранную часть на указанную часть

str.trim(’ asd ’) - строку, срезает пробелы по краям

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

Методы массивов в JavaScript?

A

arr.length: число, длина массива.
arr.push(elem): число (новая длинна массива), elem добавляется в конец.
arr.unshift(elem): число (новая длинна массива), elem добавляется в начало.
arr.pop(): значение элемента, удаляет последний elem.
arr.shift(): значение элемента, удаляет первый elem.
arr.concat(arr2): массив, соединяет два массива.
arr.splice(start, deleteCount, ...items): массив, изменяет содержимое массива, удаляя или заменяя существующие элементы и/или добавляя новые элементы.
arr.join(separator): строка, превращает массив в строку с разделителем separator.
arr.includes(searchElement): булево, проверяет наличие searchElement в массиве.
arr.sort([compareFunction]): ссылку на тот же массив, сортирует массив. Можно добавить свой способ сортировки через compareFunction.
arr.forEach(callback): ничего, позволяет выполнить функцию callback для каждого элемента.
arr.map(callback): массив, возвращает новый массив, содержащий результат вызова callback для каждого элемента массива.

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

Что такое чистая функция?

A

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

Побочные эффекты - любые взаимодействия с внешней средой. Файловые операции, отправка или приём данных по сети, вывод в консоль или изменения внешних переменных.

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

Почему в JS функции называют объектами первого класса?

A

Потому что они могут быть:
1. Присвоены переменным.
2. Переданы как аргументы другим функциям.
3. Возвращены из других функций.
4. Созданы во время выполнения программы (функции могут быть созданы динамически).

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

Как определить наличие свойства в объекте?

A

obj.hasOwnProperty(’свойство’) - вернёт bolean

‘свойство’ in obj - вернёт bolean

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

Что такое псевдомассив arguments?

A

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

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

Почему результат сравнения 2х объектов это false?

A

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

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

Что такое прототипное наследование?
Как создать объект без прототипа?

A

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

Для создания объекта без прототипа надо Object.create(null)

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

Что такое NaN? Как определить, что значение равно NaN?

A

Not a number.

Получается когда математическая функция сработала не верно, например выполнение parseIns(строка) или Math.sqrt(-1) (нет корня отрицательного числа).

Проверить возможно только через функцию isNaN(значнеие), так как NaN === NaN будет false.

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

Что такое объектная обертка (Wrapper Objects)?

A

Примитив во время исполнения кода временно преобразуется в объект. Поэтому ему и доступны все методы этого типа примитивов.

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

Как в JavaScript создать объект?

A

Объектный литерал - const obj = {…}

Функция конструктор - function Persone(name) {…}
Имя функции конструктора обязательно с большой буквы, а вызывается она через new Person(’Max’)

Метод Object.create(прототип)

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

Для чего используется ключевое слово new?

A

Для создания объекта через функцию конструктор или класс - надо использовать new.

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

Для чего используется оператор двойного отрицания (!!)?

A

Для приведения значения к логическому типу (boolean).

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

Для чего используется оператор остатка (%)?

A

Для получения остатка от деления. Практическое применение - определение кратности.

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

Как проверить, является ли значение массивом?

A

Array.isArray(переменная) - возвращает bolean

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

Как работает boxing/unboxing в JavaScript?

A

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

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

Что такое мемоизация? Реализуйте базовую логику функции для мемоизации?

A

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

const memoize = (fn) => {
  const cache = {}
  return (params) => {
	  if (cache[params]) {
	    return cache[params]
	  } else {
		  cache[params] = fn(params)
		  return cache[params]
	  }
  }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
66
Q

Разница между оператором in и методом .hasOwnProperty()?

A

obj.hasOwnProperty(’prop’) - проверит только свои собственные свойства

‘prop’ in obj - проверит в том числе в прототипах

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

Разница между глубокой (deep) и поверхностной (shallow) копиями объекта? Как сделать каждую из них?

A

Поверхностное копирование - копирование только верхнего уровня объекта.
- const car2 = {…car1}
- const car2 = Object.assign({}, car1);

Варианты создания глубокой копии:
- const car2 = JSON.parse(JSON.stringify(car1))
- const car2 = structuredClone(car1);

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

Что такое цепочка вызовов функций (chaining)? Как реализовать такой подход?

A

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

Для кастомной реализации возможно вернуть в качестве ответа “this”.

const counter = {
  count: 0,
  plusOne() {
	  this.count++
	  return this
  },
  minusOne() {
  	 this.count--
	   return this
  }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
69
Q

Что такое необъявленная переменная?

A

Не возможно использовать в “use strict” - будет ошибка.

Создаётся, если присвоить значение идентификатору, который не был объявлен с использованием ключевых слов var, let или const. Они объявляются в глобальной области видимости. Считается плохой практикой.

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

Как передаются параметры в функцию: по ссылке или по значению?

A

Параметры, которые передаются в функцию - передаются по значению. Однако стоит учитывать что при передаче объекта в переменной конечно же передаётся ссылка.

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

Как работает метод Object.create()?
Что указывается вторым аргументом?

A

Object.create(obj, [descriptors]) – создаёт пустой объект со свойством [[Prototype]], указанным как obj.

В качестве второго аргумента может быть дескриптор.

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

Разница между методами .slice() и .splice()?

A

arr.slice(от, до) - вернёт новый массив (подмассив от индекса и до индекса), старый массив не изменит

arr.splice(от, [сколько], [что вставить]) - вернёт удалённый подмассив, изменит старый массив, на место удаления добавит новые данные

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

Как работают методы .find(), .findIndex() и .indexOf()?

A

arr.find(коллбек) - вернёт первый подходящий элемент

arr.findIndex(коллбек) - вернёт индекс первого подходящего

arr.indexOf(значение) - вернёт индекс найденного значения

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

Разница между методами .push(), .pop(), .shift() и .unshift()?

A

Методы массива.
push - добавляет в конец, возвращает новую длину
unshift - добавляет в начало, возвращает новую длину

pop - удаляет в конце, возвращает элемент
shift - удаляет в начале, возвращает элемент

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

Плюсы и минусы иммутабельности?
Как достичь иммутабельности в JS?

A

Плюсы:
- Так как объекты не изменяются после создания, поведение кода становится более предсказуемым и легче тестируется

Минусы:
- Повышенные расходы на память и в целом возможное понижение производительности

Способы:
- методы, которые возвращают новый массив
- возможно заморозить объект Object.freeze()
- встроенные библиотеки

76
Q

Типы всплывающих окон в JavaScript? Нативные диалоговые окна.

A

alert(текст) - окно с текстом и кнопкой Ок

confirm(текст) - вопрос с Ок и отмена, вернёт boolean в переменную

prompt(текст, [значение по умолчанию]) - окно для ввода

77
Q

Типы объектов JavaScript?

A
  1. Стандартные встроенные объекты. Object, Array, Number итд.
  2. Коллекции объектов. Map, Set, WeakMap, WeakSet.
  3. Объект для работы с числовыми данными. Math.
  4. Объект для работы с отправкой объектов: JSON
78
Q

Типы ошибок в JavaScript?

A

ReferenceError

TypeError

SyntaxError

Логическая

79
Q

JavaScript статически, или динамически типизированный язык?

A

Динамически типизированный язык. Тип переменной проверяется во время выполнения. Так же у JS слабая динамическая типизация - тип может меняться самостоятельно.

80
Q

Что такое регулярное выражение (Regular Expression)?

A

Это шаблон для сопоставления символов в строках.

81
Q

Что такое рекурсия?

A

Это когда функция вызывает сама себя.

Обязательные условия рекурсии:

  • вызов функции самой себя
  • наличие базового случай - так называется условие при котором функция выходит из рекурсии
82
Q

Что такое полифил (polyfill)?

A

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

83
Q

Что такое switch case?
Правила использования switch case?

A

Альтернатива if else.

const score = 20
switch(score) {
 case 10:
   console.log('Score = 10')
   break;
 case 20:
   console.log('Score = 20')
   break;
 default:
   console.log('Score not 10 and not 20')
}
84
Q

Что такое выражения (expression) и инструкции (statement) в JavaScript?

A

Выражение - это фрагмент кода, которая в ходе своего выполнения приводит к возврату значения.

Инструкция - это фрагмент кода, который выполняет какое-то действие, которое является командой. Например if, else, switch, while итд.

85
Q

Разница между .some() и .every()?

A

Методы проверки значений массива.

.some(коллбек) - вернёт true, если хотя бы 1

.every(коллбек) - вернёт true, если все

86
Q

Как сгенерировать случайное число в JavaScript?

A

Math.random() - вернёт случайное число от 0 до 1 (включая).

function getRandomArbitrary(min, max) { // с заданным интервалом
  return Math.random() * (max - min) + min;
}
87
Q

Типы операторов в JavaScript?

A

x = y - оператор присваивания
x == y - оператор сравнения
x * y - арифметические (если со строкой, то строковый)
x && y, x || y, !x - логические операторы
cond ? x : y - тернарный оператор
delete x, typeof y… - унарный оператор
x in y, x instance y - оператор отношения

let x = 0, y = 1 - оператор запятая (вычисляет оба операнда и возвращает значение последнего операнда)

88
Q

Разница между параметром и аргументом функции?

A

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

Параметры - те значения, что указываются во время вызова функции.

89
Q

Разница между примитивом и объектом?

A

Примитивы - базовые типы данных. Имеют фиксированный размер и хранятся непосредственно в переменной или передаются по значению.

Объекты - сложные структуры данных. Могут содержать пары “ключ-значение”, функции и другие объекты. Все объекты передаются “по ссылке”.

90
Q

Почему typeof null возвращает object?

A

Это баг. Из-за необходимости обратной совместимости - его не исправляют.

91
Q

Для чего используется метод .includes()?

A

arr.includes(elem, [индекс]) - вернёт boolean, ищет elem начиная с индекса

str.includes(подстрока, [индекс]) - вернёт boolean, ищет подстроку начиная с индекса

92
Q

Как увеличить читаемость больших чисел?

A

Числам можно добавить “_”

Например: let number = 1_000_000_000

93
Q

Какими функциями происходит взаимодействие с DOM?
Выбор элементов?
Создание элементов?
Работа с классами?
Взаимодействие с самим элементом?

A

Выбор элементов:
document.querySelector() - выбор элемента через обычный селектор (первый подходящий)
document.querySelectorAll() - выбор всех элементов, возвращает псевдомассив
DOM-элемент.children - возвращает коллекцию дочерних элементов

Создание элементов:
document.createElement('имя_тега') - создаёт DOM-элемент (без расположения) и возвращает его
DOM-элемент-куда.appendChild(DOM-элемент-кого) - помещает элемент в конец указанного родителя
DOM-элемент.remove() - удаление элемента

Работа с классами:
DOM-элемент.classList.add('имя класса') - добавляет класс элементу
DOM-элемент.classList.remove('имя класса') - убирает класс элемента
DOM-элемент.classList.toggle('имя класса') - добавляет (если его нет) или убирает (если он есть) указанный класс

Взаимодействие с самими элементами:
DOM-элемент.textContent - текстовое содержимое
DOM-элемент.атрибут - возможно задать значение атрибута

94
Q

В чём разница между событием document load и событием document DOMContentLoaded?

A

DOMContentLoaded- запускается после создания DOM, не дожидается загрузки других ресурсов.

load - запускается в конце загрузки документа. Все объекты находятся в DOM, все изображения и скрипты загрузились.

95
Q

Можете ли вы привести пример использования стрелочных функции ()=>{}?
Чем они отличаются от других функций?

A
  1. Упрощённый синтаксис - стрелочка, простой return.
  2. Стрелочную функцию нельзя использовать как функцию конструктор.
  3. У стрелочной функции нет псевдомассива arguments.
  4. Разный this:
    this в обычных функциях имеет позднее связывание, это значит что контекст обычной функции определяется в момент вызова.
    this в стрелочных функциях имеет раннее связывание, это значит что контекст стрелочной функции определится в момент объявления.
  5. В случае использования стрелочной функции внутри класса - она не будет терять контекст при вызове “по ссылке”. Например:
class Hero {
  constructor(heroName) {
    this.heroName = heroName
  }
  logName = () => {
    console.log(this.heroName)
  }  
  logNameF() {
    console.log(this.heroName)
  }
}
const batman = new Hero('Batman')
setTimeout(batman.logName, 1000) // Batman - контекст не потеряется
setTimeout(batman.logNameF, 1000) // undefined - контекст потерялся
96
Q

Правила задания имён для переменных и функций в JavaScript?

A
  1. Буквы, цифры, _ или $
  2. Первый символ не цифра
  3. Функция должна называться в соответствии с тем что она делает. Обычно глагол.
  4. использование camelCase
97
Q

Разница между явным и неявным преобразованием (Implicit and Explicit Coercion)?

A

Явное преобразование - намеренное преобразование.

Неявное преобразование - изменение типа без участия разработчика.

1 + ‘6’ = ‘16’ // 1 стал строкой

false + true = 1 // 0 + 1

6 * ‘2’ = 12 // 2 стал цифрой

98
Q

Для чего применяется метод Array.from()?
Для чего служит второй и третий агрументы?

A

Создаёт новый массив на основе переданного объекта.

Объект должен массиво-подобным или итерируемым. Примеры: arguments, NodeList, HTMLCollection.

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

99
Q

Назовите способы преобразования массива в объект?

A

Object.assign({}, arr)
const obj = {…arr}
Перебрать массив используя arr.reduce() или arr.forEach().

100
Q

Для чего используется свойство .dataset?

A

Позволяет считывать или устанавливать на html-элементы кастомные атрибуты.

101
Q

Как работает «сборщик мусора» в JavaScript?

A

Проходит по всем доступным ссылкам начиная с самого корня. Все ссылки по которым прошёл - помечаются. Затем все до которых не добрался - удаляются.

102
Q

Что такое утечки памяти?
Назовите основные типы утечек памяти в JavaScript?

A

Утечки памяти - фрагменты памяти, которые больше не нужны приложению, но при этом не были очищены и возвращены операционной системе.

Основные причины:

  1. Глобальные переменные.
    Объявленные без let, const, var. Избежать возможно используя строгий режим.
  2. Таймеры.
    Таймеры надо очищать.
  3. Замыкания.
  4. Ненужные обработчики событий
103
Q

Что значит текст max call stack size exceeded в консоли?

A

В браузере произошло переполнение стека вызовов и из-за этого он неможет больше выполнять этот скрипт.

104
Q

Что такое и как работает debounce() и throttle() в JavaScript?

A

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

debounce - гарантирует что функция не будет выполнена, пока не пройдёт какое-то количество времени без каких-то попыток вызова этой функции (например поиск после завершения ввода в поле)

function debounce(func, wait) {
  let timeout
  return function(...args) {
    clearTimeout(timeout)
    timeout = setTimeout(() => func.apply(this, agrs), wait)
  }
}

throttle - гарантирует что функция будет вызвана не более 1 раза за определённое время (например изменение размера окна)

105
Q

Подходы при работе с асинхронным кодом?

A

Асинхронные функции - это функции, которые не блокируют основной поток исполнения.

  1. Callback
  2. Promice
  3. async/await
106
Q

Плюсы и минусы асинхронного программирования в JavaScript?

A

Плюсы:

  • Более быстрое выполнение кода. Нет блокировки потока выполнения.
  • Более плавный пользовательский интерфейс. Можем обновлять интерфейс не прерывая остальные операции.
  • Удобное взаимодействие с сетевыми ресурсами.

Минусы:

  • Сложность отладки. Операции могут выполняться не по порядку.
  • Сложность обработки ошибок. Ошибки могут возникать в разные моменты.
  • Сложность обработки состояния. Операции могут выполняться параллельно.
  • Сложность изучения.
107
Q

Какие проблемы может вызвать неправильное использование асинхронности в JavaScript?

A
  1. Гоночные условия.
    Несколько операций делают одно и тоже - не известен результат.
  2. Зависания
    Когда операции ожидают завершения друг друга.
  3. Потеря данных
    Если запись происходит в неожиданный момент.
  4. Трудности отладки
108
Q

Что такое callback-функция? Что такое Callback Hell и как его избежать?

A

allback-функция - передача функции в качестве аргумента для функции.

Callback Hell - вложенность коллбеков, при которой получается несколько уровней.

Использовать promice и async/await.

109
Q

Что такое async/await?

A

Актуальный способ написания асинхронного кода. Основан на промисах.

Для использования надо объявлять функцию как асинхронную - async function() {}.

Тогда внутри можно будет использовать await.

Такая функция вернёт промис.

110
Q

Разница между Promise.all(), Promise.any() и Promise.race()?

A

В качестве аргумента - массив промисов.

all - вернёт массив результатов, только если все завершились успешно, либо ошибку
race - вернёт промис, первый выполненный (результат или ошибку)
any - вернёт промис, первый любой успешный

111
Q

Расскажите про статический метод Promise.allSettled()?

A

Похож на Promise.all(), но не все должны обязательно быть успешными.

Promise.all() - вернёт массив результатов или ошибку.

112
Q

Как выполнить несколько асинхронных операций последовательно?

A

Цепочка промисов .then() или async/await

113
Q

Что такое fetch()?
Как работает функция fetch()?

A

fetch(url, [options]) - метод для сетевых запросов, возвращает промис

По умолчанию без объекта options - это просто GET запрос по указанному url.

Процесс выполняется в 2 этапа:

  1. Сначала промис при выполнении отдаст объект класса Response. В нём содержатся заголовки ответа. На этом этапе, например, можно проверить статус HTTP-запроса, в свойстве status будет код ответа.
  2. На втором этапе промиса - для получения ответа надо воспользоваться методом, который преобразует результат в нужный тип данных. (например response.text(), response.json() и др.)
let response = await fetch(url); // первый этап

if (response.ok) { // если HTTP-статус в диапазоне 200-299
  let json = await response.json(); // второй этап
} else {
  alert("Ошибка HTTP: " + response.status);
}

Метод чтения ответа (.json() / .text()) может быть выполнен всего один раз.

Заголовки

Заголовки ответа хранятся в похожем на Map объекте response.headers.

Заголовки своего запроса можно поместить в объекте options в объект в свойстве headers.

let response = fetch(protectedUrl, {
  headers: {
    Authentication: 'secret'
  }
});

POST-запрос

Для отправки POST-запроса или запроса с другим методом - нужны будут дополнительные параметры options.

Вторым параметром к вызову добавляется объект со свойствами:

method- HTTP метод, напримерPOST

headers - объект с заголовками

body- основной вид это строка (например, в формате JSON), но есть и другие варианты

let response = await fetch('some/url', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  body: JSON.stringify(someObj)
});
114
Q

Что такое JSON в JavaScript? Как его можно использовать?

A

JSON - java script object notation формат данных, который используется для хранения и передачи данных между сервером и клиентом.

Представляет набор пар ключ-значение.

Ключи всегда строки.

Значения могут быть: строками, числами, объектами, массивами, булевыми или null.

115
Q

Что такое и как работает коэффициент сжатия (compression ratio) в контексте веб-разработки?

A

Коэффициент сжатия - это показатель эффективности сжатия данных.

Есть какие-то механизмы сжатия данных. А чем меньше данные - тем быстрее всё загрузится.

116
Q

Что такое ECMAScript? В чём отличие от JavaScript?

A

ECMAScript — это стандарт (набор правил) для языков программирования. JavaScript — это язык, который следует этим правилам. Таким образом, JavaScript — реализация стандарта ECMAScript.

117
Q

Можно ли изменить значение определённое через const?

A

Нельзя. Можно только изменить объект по сохранённой ссылке.

118
Q

Что такое временная мёртвая зона (temporal dead zone)?

A

Механизм, который позволяет делать вид, что переменные с let и const на самом деле не всплывают.

119
Q

Для чего используется цикл for…of и for..in?

A

for..in - перечисляет индексы

for..of - перечисляет значения

120
Q

Что такое Set, Map, WeakMap и WeakSet?

A

Set - коллекция уникальных значений.

Map - коллекция ключ значение. Отличие в том что ключtм может быть любой тип.

WeakSet и WeakMap - не препятствуют сборщику мусора удалять свои значения. Если значение есть только в коллекции и никто на него не ссылается.

121
Q

Что такое итераторы?

A

Итератор — это объект, который предоставляет метод next(), возвращающий следующий элемент последовательности. Вернёт объект с value и done.
Итерируемые объекты - объекты, которые содержат в себе итератор.

122
Q

Что такое символ (Symbol) в ES6?

A

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

Создаются с помощью Symbol(’строка’)

123
Q

Как работают дефолтные параметры в ES6?

A
function greet(name = 'Guest') {
  console.log(`Hello, ${name}!`);
}
124
Q

Что такое BigInt в ES2020 и для чего он используется?

A

Тип данных для работы с большими числами (более 64 бит).

Создать можно через BigInt(123…) или 123n.

125
Q

Для чего используется метод .getOwnPropertyDescriptors()?

A

Вернёт объект с дескрипторами всех свойств.

{
  prop1: { "value": "Blah-blah", "writable": true, "enumerable": true, "configurable": true },
  prop2: { value: "yada-yada", writable: true, "enumerable": true, "configurable": true }
}

Дескриптор одного свойства:
value - значение
enumerable - перечисляемый
writable - можно изменять значение
configurable - запрещает изменять значения остальных дескрипторов (кроме значения)

126
Q

Расскажите о методах .keys(), .values(), .entries()?

A

Методы объектов.

keys - вернёт массив ключей

values - вернёт массив значений

entries - вернёт массив массивов [ключ, значение]

127
Q

Для чего используется метод .fromEntries()?

A

Для создания объекта из результата выполнения метода .entries().

128
Q

Для чего используются методы .flat() и .flatMap()?

A

arr.flat(число) - сплющивает массив на указанное количество уровней (можно указать Infinity). Так же может удалять пустые значения.

const arr = [1, [2, 3], [4, [5, 6]]];
console.log(arr.flat();); // [1, 2, 3, 4, [5, 6]]

arr.flatMap(коллбек) - применяет коллбек к элементам, а затем делает flat

129
Q

Для чего используются методы .padStart() и .padEnd()?

A

str.padStart(3, ‘=’) // ‘===test’
str.padEnd(5) // ‘test ’

Добавить в начало или в конец указанных символов.

130
Q

Для чего используются методы .startsWith() и .endsWith()?

A

str.startsWith(’строка’, [длина]) - вернёт boolean, проверяет наличие подстроки в начале или в конце.

Можно указать количество символов, которые надо отбросить.

131
Q

Как в JavaScript удалять пробельные символы в начале и в конце строки?

A

str.trim()

str.trimStart()

str.trimEnd()

132
Q

Расскажите об операторе Optional Chaining (?.)?

A

Используется для исключения ошибки при обращении к несуществующим свойствам и методам.
Если свойства нет - вернётся undefined.

let user = {
    name: 'John',
    address: {
        city: 'New York'
    }
};

console.log(user.address?.city); // 'New York'
console.log(user.address?.street); // undefined
133
Q

Для чего используется метод .replaceAll()?

A

str.replace(’строка’, ‘подстрока’) - заменит первое найденное

str.replace(regExp, ‘строка’) - заменит всё найденное

str.replaceAll(’строка’ или regExp, ‘строка’) - заменит всё найденное

134
Q

Что такое оператор нулевого слияния (??)?

A

const text = x ?? y

Это тоже самое что и:
const text = (x ≠ null && x ≠ undefined) ? x : y

Если первое значение не определено, то берём второе.

135
Q

В чём отличие оператора нулевого слияния (??) и оператора “ИЛИ” (||)?

A

В выражении const result = x ?? y оператор ?? отбросит x, только если он будет null или undefined

В выражении const result = x || y оператор || выполнит скрытое преобразование строки '' и 0 в false

136
Q

Назовите основные методы и свойства работы с коллекцией Map?

A

new Map() - создать Map
.set(key. value) - добавить пару
.get(key) - получить значение (undefined, если не найдено)
.has(key) - проверяет наличие ключа, boolean
.delete(key) - удаляет ключ
.clear() - очистит всю коллекцию
.size - размер

137
Q

Назовите основные методы и свойства работы с коллекцией Set?

A

new Set(iterable) - создать сет
.size - размер
.add(value) - добавляет значение, если оно уже есть, то не добавит (вернёт сам set в ответ)
.delete(value) - удаляет значение, вернёт true если оно было
.has(value) - проверяет наличие значения, вернёт boolean
.clear() - очищает всю коллекцию

138
Q

Как осуществить перебор элементов в коллекциях Map и Set?

A

Использовать .forEach() и for…of.

Как альернативный вариант получить псевдомассивы:
.keys() - ключи
.values() - значения
.entries() - пары ключ-значение

139
Q

Объекты и их методы.
Как сделать копию?

A

Object.keys(obj) - массив ключей
Object.values(obj) - массив значений
Object.entries(obj) - массив ключ-значение
Object.fromEntries(arr) - создать массив из ключ-значение

Глубокое копирование:
structuredClone(старыйОбъект)
JSON.parse(JSON.stringify(старыйОбъект)) - при таком варианте без undefined и сложных структур типа Date.

Поверхностные копии:
Object.assign(target, source1, source2, /* …, */ sourceN) -
новыйОбъект = {…старыйОбъект}

140
Q

Разница между Object и Map?

A

Map ключи могут быть чем угодно (включая функции, объекты и любые примитивы).
Object ключи String и Symbol.

Ключи в Map упорядочены в порядке вставки.
Ключи в Object не упорядочены.

141
Q

Дескрипторы объекта
- Как получить
- Как выглядит
- Как изменить

A

У свойств объектов помимо самого значения есть ещё дополнительные скрытые свойства.

Object.getOwnPropertyDescriptor(obj, prop) - получить дескриптор свойства

{ "value": "John",
  "writable": true,
  "enumerable": true,
  "configurable": true }

Object.defineProperty(obj, prop, descriptor) - изменить дескриптор

Object.getOwnPropertyDescriptors(obj) - получить объект с всеми дескрипторами

{ prop1: { value: "Blah-blah", writable: false, ... },
  prop2: { value: "Yald-yald" ...} }

Object.defineProperties(obj, descriptors) - изменить все

142
Q

Классы и их синтаксис

A

Синтаксис:

class MyClass {
	constructor() { ... }
	method1() { ... }
	static prop = 'bla-bla'
	get propName() { ... }
	set propName(val) { ... }
}

Статическая (static) переменная или метод, доступны только у самого класса (MyClass.prop вернёт 'bla-bla')

Объекты класса создаются через new.

Класс можно расширить (наследование) через extends:

class newClass extends MyClass {
	constructor(...args) {
		super(arg1) //конструктор родителя обязателен к вызову
		this.prop = 'val'
		method3() {
			super.method1() // можно вызывать методы родителя через super
		}
    }
}

Если не написать конструктор, то под капотом будет конструктор с super(args).

143
Q

Ошибки и их обработка
- Как обработать ошибку
- Как поймать асинхронную ошибку
- Что делать с логической ошибкой
- Проброс исключений
- Глобальный обработчик

A
  1. Конструкция
    try..catch..finaly
    catch и finaly не обязательны
  2. Асинхронные ошибки
    Если ошибка в try произойдёт асинхронно, она не поймается. Для поимки такой ошибки try..catch должен быть внутри асинхронной функции.
  3. Генерация своих ошибок
    Если происходит логическая ошибка, можно сгенерировать собственную ошибку с помощью оператора throw.
  4. Проброс исключений
    Принято, чтобы catch обрабатывал только известные ему ошибки, а остальные “пробрасывал” дальше.
  5. Глобальный обработчик
    В браузере можно использовать window.onerror, чтобы добавить функцию, которая сработает при глобальной ошибке. Обычно им ошибка отправляется разработчику.
    window.onerror = function(message, url, line, col, error) { ... }
    message - сообщение об ошибке
    url - URL скрипта в котором произошла ошибка
    line, col - номер строки и столбца в которых произошла ошибка
144
Q

Для чего нужны пользовательские ошибки?
Как объявить пользовательскую ошибку?

A

Пользовательские ошибки нужны для создание своих классов ошибок (например HttpError или DBError) и своих свойств у этих ошибок (например у HttpError код ошибки: 404 или 500).

Оператор throw позволяет использовать любые аргументы, но использование наследования от Error нам даёт возможность убедиться в том что это объект ошибки через obj instanceof Error.

145
Q

Объясните, как this работает в JavaScript.
- Глобально
- Внутри function
- Внутри ()=>{}
- Как явно указать this
- Потеря контекста

A

this - это текущий контекст

  1. Глобальный контекст
    В баузерах - window
    В Node.js - global
  2. Внутри function
    - позднее связывание, контекст в момент вызова
    - обычный вызов, будет глобальным или undefined в строгом
    - метод объекта, будет этот объект
    - вызов конструктора, будет создаваемый объект
  3. Внутри ()=>{}
    - ранее связывание, контекст в момент создания
    - контекст берётся из окружения
  4. Явное указание
    - fn.call(конт, [arg1, arg2...]) вызовет
    - fn.apply(конт, [argsArr]) вызовет
    - fn.bind(конт, [arg1, arg2...]) вернёт функцию
  5. Возможные проблемы
    - потеря контекста в коллбеках, надо стрелку или bind
146
Q

В чем разница между .call, .apply и .bind?

A

Методы для задания контекста вызова.
- fn.call(конт, [arg1, arg2...]) вызовет
- fn.apply(конт, [argsArr]) вызовет
- fn.bind(конт, [arg1, arg2...]) вернёт функцию

147
Q

Разниц между Object.freeze() и Object.seal()?

A

Object.seal(obj) :
- запрещает добавлять/удалять свойства
- устанавливает configurable: false для всех
- проверить Object.isSealed(obj), вернёт boolean.

Object.freeze(obj) :
- запрещает добавлять/удалять/изменять свойства
- устанавливает configurable: false, writable: false для всех
- проверить Object.isFrozen(obj), вернёт boolean.

148
Q

Разница между typeof и instanceof?

A

typeof - возвращает строку с названием типа

instanceof - возвращает boolean при проверки принадлежности к классу (’str’ instanceof String)

149
Q

Что такое оператор логического присваивания?

A

a &&= b // тоже что и if (a) { a = b }
a ||= b // тоже что и if (!a) { a = b }
a ??= b // тоже что и if ( a === null || a === undefined) { a = b }

150
Q

В чём разница между классом в ES6 и функцией-конструктором в ES5?

A

Класс это синтаксический сахар функций-конструкторов.

function Person(name) {
	this.name = name
}

class Person {
	constructor(name) {
		this.name = name
	}
}

Основная разница возникает при использовании наследования:

  • Класс можно расширить через extends:
      class Student extends Person {
      	constructor(name, studentID) {
      		super(name)
      		this.studentID = studentID
      	}
      }
     
  • При расширении функции-конструктора надо будет сделать больше действий:
      function Student(name, studentID) {
      	Person.call(this, name) // вызов конструктора супер-класса
      	this.studentID = studentID // новое свойство
      }
      Student.prototype = Object.create(Person.prototype)
      Student.prototype.constructor = Student
     
151
Q

Расскажите, как работает прототипное наследование.
- В чём идия наследования
- Как создать объект с наследованием
- Как проверить наследование
- Перебор свойств головного объекта

A

Основная идея наследования: если свойства или метода нет, то оно будет искаться у прототипа.

Object.create(другойОбъект) - создаст новый объект с указанием “другого объекта” в качестве прототипа.

someObj instanseof ClassName - способ проверки что someObj является экземпляром головного объекта ClassName

У встроенных методов объекта enumerable: false, значит что они не доступны в цикле.

Цикл for..in перебирает как свои, так и унаследованные свойства. Остальные методы получения ключей/значений работают только с собственными свойствами объекта. При использовании именно for..in отфильтровать свои свойства можно с помощью obj.hasOwnProperty(key).

152
Q

Что такое замыкание?
Как его используют?

A

При создании функции и использовании внутри неё переменных - эти переменные доступны только локально внутри функции. Снаружи мы не можем получить к ним доступ. На хранение таких переменных выделяется определённая память. Когда функция заканчивает своё выполнение - эта память очищается. Таким образом эти переменные больше нигде не существуют.

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

Что бы создать замыкание нужно будет вернуть эту внутреннюю функцию:

function counter () {
	let count = 0
	return function () {		
		return count++
	}
}

Внутренняя функция замыкается на переменной внешней и не даёт памяти очиститься.

152
Q

__proto__, [[Prototype]], prototype
У кого есть prototype?
у кого одинаковый proto?

A

[[Prototype]] - ссылка на объект прототипа (тот который prototype)

__proto__ - свойство аксессор для [[Prototype]]

prototype - объект у функции конструктора в котором хранится набор свойств и методов класса. Есть только у Класса, функции конструктора и функций объявленных через function (не стрелочных).

__proto__ объектов одного типа - будет одинаковым. Например ‘str1’.__proto__ === ‘str2’.__proto__

__proto__ устарело, надо использовать Object.getPrototypeOf и Object.setPrototypeOf

153
Q

Как работает контекст выполнения (execution context) в JavaScript?

A

Это абстрактное понятие, которое описывает окружение в котором выполняется код.

Каждый раз, когда выполняется функция - создаётся новый контекст выполнения, который содержит информацию о переменных, функциях, объекте this и других данных необходимых для работы функции.

Они образуют call stack. При вызове функции - новый контекст помещается на вершину стека. Код начинает выполняться в этом новом контексте. По завершению - контекст убирается из стека и управление возвращается к предыдущему контексту.

154
Q

Как реализовать отложенную загрузку изображений?

A

Атрибут для тега <img> - loading="lazy” (auto, lazy, eager - сразу).

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

155
Q

Чем отличаются события input и change?

A

Это события ввода.

Событие input

  • Когда срабатывает: при любом изменении значения в элементе (например, при каждом нажатии клавиши).
  • Где используется: поля ввода текста (<input type="text">, <textarea>, и т.д.).
  • Применение: для отслеживания изменений в реальном времени.

Событие change

  • Когда срабатывает: после завершения изменения значения и потери фокуса (например, после того как пользователь покинул поле ввода).
  • Где используется: поля ввода текста, элементы выбора (<select>, <input type="checkbox">, <input type="radio"> и т.д.).
  • Применение: для реакций на окончательные изменения.

Основные различия

  • input срабатывает сразу при изменении значения.
  • change срабатывает только после завершения изменения и потери фокуса.
156
Q

Что такое DOM?

A

Document Object Model - объектная модель документа, которую браузер создаёт в памяти на основании HTML кода.

157
Q

Методы поиска элементов в DOM?

A

document.getElementById(’id’) - по id
document.getElementByName(’name’) - по атрибуту name (используется редко)
document.getElementsByTagName(’div’) - все элементы по тегу
document.getElementsByClassName(’class’) - все элементы по имени классу

document.querySelector(’nav + p’) - первый найденный по CSS селектору
document.querySelectorAll(’nav > ul > li’) - все найденные по CSS селектору

158
Q

Что такое BOM?

A

Browser Object Model - позволяет JS взаимодействовать с браузером

Содержит в себе такие объекты как location, history, screen итд.

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

159
Q

Виды событий в JavaScript?

A

События мыши - mousedown/mouseup, click, dblclick, mousemove, mouseover
События клавиатуры - keydown/keyup
События формы и элементов управления - submit, focus/blur, change, reset

События перетаскивания
События объектов и фреймов
События анимации
События буфера обмена
События мультимедиа
События перехода
События, посылаемые сервером
События касания
События печати

160
Q

Как добавить/удалить обработчик события на DOM-элемент?

A
  • Атрибут HTML или свойство DOM-объекта - on<событие>="код" или elem.onclick = function () { ...код... }.
    Убрать его можно назначив null - elem.onclick = null.
    Можно повесть только 1 функцию.
  • Метод elem.addEventListener('событие', e => { код }, [options])
    Убрать можно через elem.removeEventListener('событие', имяФункции), поэтому анонимную функцию - нельзя будет удалить.
  • Есть необязательный объект со свойствами [options], по умолчанию значения false:
    once: если true, то выполнится один раз, затем удалится
    capture: фаза срабатывания события, если true, то поймает на погружении
    passive: если true, то это сигнал браузеру о том что обработчик не собирается отменять действие по умолчанию

Когда происходит событие - браузер создаёт объект события в котором записано много деталей события. Его можно передать в обработчик в качестве аргумента. В HTML объект события всегда будет event.

161
Q

Что такое распространение события (Event Propagation)?

A

Есть 3 фазы распространение события:

  1. Фаза погружения – событие сначала идёт сверху вниз.
  2. Фаза цели – событие достигло целевого элемента. Её нельзя обработать отдельно. При её достижении срабатывают оба варианта обработчика события.
  3. Фаза всплытия – событие идёт снизу вверх. По умолчанию именно на всплытие реагирует eventListener.
162
Q

Разница между HTMLCollection и NodeList?

A

HTMLCollection - это динамическая коллекция элементов, которая автоматически обновляется при изменении структуры документа.
NodeList - это статическая коллекция узлов, которая не обновляется автоматически при изменении структуры документа.

163
Q

Какая разница между узлами (Node) и элементами (Elements)?

A

Узел (Node)
Узлы — это базовые компоненты DOM, представляющие различные части документа (элементы, текст, комментарии, атрибуты и т.д.).

Элемент (Element)
Специфический тип узлов, представляющий HTML-теги.

164
Q

Как динамически добавить элемент на HTML-страницу?

A

Создать элемент:
const newElem = document.createElement(’p’)
Добавить к нему класс:
newElem.classList.add(’someClass’)
Создать текстовый узел:
const textNode = document.createTextNode(’Hello world’)
Добавить текстовый узел к элементу:
newElem.appendChild(textNode)
Добавить элемент на страницу:
document.getElementById(’test’).appendChild(newElem)

165
Q

Разница между e.preventDefault() и e.stopPropagation()?

A

event.preventDefault() - основной способ отменить действие по умолчанию.
Альтернативный метод - вернуть false из обработчика on<событие>. Другие возвраты не будут работать.

У клика на ссылку - отменит переход на другую страничку. У клика на кнопку подтверждения формы - отменит отправку.

event.stopPropagation() - остановит всплытие события на этом моменте. Не стоит пользоваться без крайней необходимости, так как от остановки всплытия могут быть проблемы, например нельзя будет отследить клики на документе для аналитики.

166
Q

Разница между event.target и event.currentTarget?

A

target - элемент, который вызвал начало всплытия события

currentTarget - элемент на котором всплытие находится в текущий момент

167
Q

Разница между .stopPropagation() и .stopImmediatePropagation()?

A

event.stopPropagation() - остановит всплытие события на этом моменте. Не стоит пользоваться без крайней необходимости, так как от остановки всплытия могут быть проблемы, например нельзя будет отследить клики на документе для аналитики.

event.stopImmediatePropagation() - остановит всплытие + события на этом элементе не будут выполнены

168
Q

Разница между innerHTML и outerHTML?

A

innerHTML - свойство DOM элемента, позволяет получить или установить содержимое “внутри” выбранного элемента в виде строки

outerHTML - свойство DOM элемента, позволяет получить или установить содержимое “внутри” выбранного элемента и самого элемента в виде строки

169
Q

Разница между JSON и XML?

A

JSON:

  • Текстовый формат обмена данными
  • Ключ-значение
  • Компактный

XML:

  • Язык разметки, в котором есть синтаксис
  • Объёмный из-за разметки
  • Парсинг медленнее
170
Q

Как узнать об использовании метода event.preventDefault()?

A

event.defaultPrevented - вернёт boolean.

171
Q

Для чего используется свойство window.navigator?

A

Возвращает объект описания приложения, которое выполняет скрипт. Почти всегда это браузер.

Содержит:
- информацию о браузере
- предпочитаемый язык и массив предпочитаемых языков
- включены ли куки

172
Q

Для чего используется метод .focus()?

A

Устанавливает фокус на указанный элемент.

Когда элемент в фокусе - он перехватывает события клавиатуры.

173
Q

Для чего используется свойство .forms?

A

document.forms вернёт HTML-коллекцию с всеми формами страницы. (можно применять только к document)

174
Q

Разница между методами .submit() и .requestSubmit()?

A

Метод .submit() позволяет программно отправить форму, но он игнорирует валидацию полей формы и не запускает обработчики события submit на форме.

Метод .requestSubmit() также позволяет программно отправить форму, но он учитывает валидацию полей формы (атрибут required) и запускает обработчики события submit на форме.

175
Q

Расскажите о IntersectionObserver?

A

Это браузерный API, которое позволяет отслеживать изменения в пересечении элементов с viewport или другим элементом.

176
Q

Расскажите о URLSearchParams?

A

URLSearchParams- это класс, предоставляющий удобное API для формирования строки поисковых параметров

177
Q

Как можно создавать пользовательское событие (custom events) в JavaScript?
Как вызвать его?
Как отличить от настоящего?

A

Через класс Event и CustomEvent можно создать объект события.
new Event(type, [options])
new CustomEvent(type, [options])

type - тип события, его “имя” по которому будем с ним потом работать

options – объект с необязательными свойствами (по умолчанию false):
bubbles – если true, тогда событие всплывает
cancelable – если true, тогда можно отменить действие по умолчанию
detail – только у CustomEvent. Туда можно записать что угодно, отдельное оно - для избегания возможных конфликтов.

Через метод elem.dispatchEvent(event) можно вызвать срабатывание любого события, в том числе и пользовательского.

Отличить “настоящее” событие от вызванного вручную возможно через свойство события isTrusted (true - настоящее).

178
Q

Принципы ООП?

A

Инкапсуляция

Наследование

Абстракция

Полиморфизм

179
Q

Что такое наследование (ООП)?

A

В ООП наследование позволяет одному классу (подклассу) наследовать свойства и методы другого класса (суперкласса). Это позволяет использовать повторно код суперкласса и расширять его функциональность в подклассах.

180
Q

Что такое инкапсуляция (ООП)?

A

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

181
Q

Что такое абстракция (ООП)?

A

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

class Bird {
    fly() { throw new Error("Should be overridden"); }
}

class Sparrow extends Bird {
    fly() { console.log("Sparrow flies"); }
}

class Eagle extends Bird {
    fly() { console.log("Eagle soars"); }
}
182
Q

Что такое полиморфизм (ООП)?

A

Это способность использовать объекты разных типов через один и тот же интерфейс.

function makeBirdFly(bird) {
    bird.fly();  // Полиморфный вызов метода fly
}

const sparrow = new Sparrow();
const eagle = new Eagle();

makeBirdFly(sparrow); // Sparrow flies
makeBirdFly(eagle);   // Eagle soars
183
Q

Зачем нужен конструктор Proxy?

A

Конструктор Proxy в JavaScript позволяет перехватывать и настраивать операции с объектами, такие как чтение, запись и удаление свойств. Прокси-объекты предоставляют гибкий механизм для управления поведением объектов, обеспечивая контроль и защиту данных без изменения исходного объекта.

184
Q

Что такое приватные аксессоры (геттеры и сеттеры)?

A

Это обычные геттеры и сеттеры, только с использованием нового символа, который обозначает приватность - #.

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

get #getName() { … }

set #setName() { … }

185
Q

В чём разница между стеком вызовов (call stack) и очередью событий (task queue)?

A

Call Stack: Обрабатывает синхронные задачи. Функции добавляются и удаляются в порядке выполнения.

Task Queue: Обрабатывает асинхронные задачи, которые выполняются, когда стек вызовов пуст.

186
Q

Что такое обёртывание исключений?
Как его реализовать?

A

Можно сделать так, что бы из функции приходил всегда один тип ошибки (аля “имяФункцииОшибка”), а в себе уже содержал ссылку на оригинальную ошибку.

Например таким образом создать класс для ошибки:

class ReadError extends Error {
  constructor(message, cause) {
    super(message);
    this.cause = cause; // тут будет оригинальная ошибка
    this.name = 'ReadError';
  }
}

В catch мы обработаем все причины и “обернём” их в один тип ошибки:

try {...} catch (err) {
	if (err instanceof SyntaxError) {
		// msg + ссылка на оригинальную ошибку
		throw new ReadError("Синтаксическая ошибка", err);
	} else {
		throw err;
	}
}

try {...} catch (err) {
	if (err instanceof ValidationError) {
		// msg + ссылка на оригинальную ошибку
		throw new ReadError("Ошибка валидации", err);
	} else {
		throw err;
	}
}

Снаружи будем ловить один тип ошибки ReadError и если что иметь доступ к оригинальной причине ошибки через cause. Неизвестные ошибки пробрасываем дальше.