Js Flashcards

1
Q

Что такое DOM.

A

Это document object model.
Это объект для взаимодействия с HTML документами.

(((( Когда браузер первый раз читает («парсит») HTML документ, он формирует большой объект - DOM. DOM используется для взаимодействия и изменения самой структуры DOM или его отдельных элементов и узлов. В JS DOM представлен объектом Document. Объект Document имеет большое количество методов для работы с элементами, их созданием, модификацией, удалением и т.д.))))

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

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

A

Событие, которое произошло в браузере, распространяется от глобального элемента window до целевого элемента и обратно.
Есть 3 фазы распространения события -
Фаза погружения,
Целевая фаза,
Фаза всплытия,

(((Когда какое-либо событие происходит в элементе DOM, оно на самом деле происходит не только в нем. Событие «распространяется» от объекта Window до вызвавшего его элемента (event.target). При этом событие последовательно пронизывает (затрагивает) всех предков целевого элемента. Распространение события имеет три стадии или фазы:
Фаза погружения (захвата, перехвата) — событие возникает в объекте Window и опускается до цели события через всех ее предков.
Целевая фаза — это когда событие достигает целевого элемента.
Фаза всплытия — событие поднимается от event.target, последовательно проходит через всех его предков и достигает объекта Window)))

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

В чем разница между методами event.preventDefault() и event.stopPropagation()?
Привести примеры

A

Метод event.preventDefault() отключает поведение элемента по умолчанию.
Нажатие кнопки «Отправить» предотвращает отправку формы

Метод event.stopPropagation() отключает распространение события (его всплытие или погружение).
Используется когда нужно остановить распространение события (дальше есть какие-то листенеры/обработчики жтого события которые не нужно вызывать)

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

В чем разница между операторами “==” и “===”?

A

Разница между оператором “==” (абстрактное или нестрогое равенство) и оператором “===” (строгое равенство) состоит в том, что первый сравнивает значения после их преобразования или приведения к одному типу (Coersion), а второй — без такого преобразования.

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

Что такое поднятие (Hoisting)?

A

Поднятие — это термин, описывающий подъем переменной или функции в глобальную или функциональную области видимости.
Var и function всплывают в самый верх функциональной области видимости.

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

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

A

Область видимости — это место, где (или откуда) мы имеем доступ к переменным или функциям.
JS имеем три типа областей видимости: глобальная, функциональная и блочная (ES6).

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

Если в глобальной области видимости переменная обнаружена, поиск прекращается, если нет — выбрасывается исключение.
Поиск осуществляется по ближайшим к текущей областям видимости и останавливается с нахождением переменной.

(((((((
Блочная -например if for
Функциональная - в теле функции
Глобальная - можно обратиться из любого место в коде к переменной

При создании области видимости она запоминает ссылку на внешнюю область видимости. Таким образом получаются цепочки области видимости. Мы из одной области видимости можем обращаться за переменными из другой области видимости
)))))))))

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

Что такое замыкание (Closures)?

A

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

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

Какое значение имеет this?

A

this ссылается на значение объекта, который в данный момент выполняет или вызывает функцию.

(((((((((
Методу объекта обычно требуется доступ к информации, хранящейся в объекте, для выполнения своей работы.
Для доступа к информации внутри объекта метод может использовать ключевое слово this.
«В данный момент» означает, что значение this меняется в зависимости от контекста выполнения, от того места, где мы используем this.
const carDetails = {
name: ‘Ford Mustang’,
yearBought: 2005,
getName() {
return this.name
}
isRegistered: true
}
console.log(carDetails.getName()) // Ford Mustang

————————————————————
var name = ‘Ford Ranger’
var getCarName = carDetails.getName

console.log(getCarName()) // Ford Ranger
Стрелочные функции не имеют собственного значения this. Они копируют значение this из внешнего лексического окружения.
))))))))))))))))

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

Для чего используется метод Function.prototype.apply?

A

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

Первым аргументом передается обект, вторым масив с аргументами функции.

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

Для чего используется метод Function.prototype.call?

A

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

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

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

Что такое прототип объекта?

A

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

Prototype есть только у классов и function decloration. У остальных типов данных его нету.

Если мы хотим прочитать свойство obj или вызвать метод, которого не существует у obj, тогда JavaScript попытается найти его в прототипе.
Потом в прототипе прототипа и так далее до тех пор пока не будет значение null

function Person(first, last, age, gender, interests) {
// Определения методов и свойств
this.name = {
first: first,
last: last,
};
this.age = age;
this.gender = gender;
//…см. Введение в объекты для полного определения
}

var person1 = new Person(“Bob”, “Smith”, 32, “male”, [“music”, “skiing”]);

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

Что такое функциональное программирование и какие особенности JS позволяют говорить о нем как о функциональном языке программирования?

A

ФП - это набор концепций, правил и особенностей при написании кода

Концепции ФП:
- Деклоративность
- Чистые функции
- Функции высшего порядка
- Имутабельность (неизменяемость)

Деклоративность:
Декларируем какой результат мы хотим получить.
Есть два подхода к написанию кода: Императивный и деклоративный. В декларативном подходе мы описываем что мы хотим получить (описываем результат). В императивном мы описываем как мы хотим получить (описываем действия).

(((((((
Пример с такси

https://images.ctfassets.net/htsjgx8vu9xb/18LKaY0g2uD4lbenBH3OYv/6c3007966c1189b46e92373416d2872c/Screenshot_2024-11-09_at_15.02.41.png

Те в декларативном подходе мы на каком-то уровне пишем самодокументирующие функции, и из их названия понятен результат на выходе
https://images.ctfassets.net/htsjgx8vu9xb/4C5gxv0ONVjSBXYV3zTO6q/6ad3f2dc87c2bdcd3b16d57ce509bee9/Screenshot_2024-11-09_at_15.06.46.png
)))))))))))))

  • Чистые функции
    —-При одинаковых значениях аргументов функции функция возвращает один и тот же результат
    —-Не зависят от внешних состояний и глобальных переменных
    —-Не зависит от сайд еффектов (не содержит запросов на сервер, логирование, асинхронные действия)

-Имутабельность
Мы не мутируем(изменяем) уже существующие данные, а создаем новые данные и ведем работу уже с этими данными. Хочешь изменить существующие данные - делай копию и работай с ней.

Почему мутирование плохо?
-Несогласованность данных
-Услложняет дебаг и тестирование кода

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

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

Что такое функции высшего порядка (Higher Order Functions)?

A

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

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

Что такое ECMAScript?

A

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

JavaScript -
cкриптовый язык общего назначения, соответствующий спецификации ECMAScript.

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

((((((((((((
JavaScript-движок - Программа или интерпретатор, способный понимать и выполнять JavaScript-код.
При желании, разработчики могут с помощью Babel преобразовать — транспилировать — код ES6 в функционально эквивалентную версию, использующую только функции ES5. Все основные браузеры полностью поддерживают ES5, поэтому транспилированный код будет работать без каких-либо проблем.
JavaScript был создан в 1996 году. В 1997 году Ecma International предложила стандартизировать JavaScript, и в результате появился ECMAScript. Но поскольку JavaScript соответствует спецификации ECMAScript, JavaScript является примером реализации ECMAScript.
)))))))))))))

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

Cтандарт ES6 или ECMAScript2015

A

Вот что вышло в ES6:
Стрелочные функции (Arrow Functions).
Классы (Classes).
Шаблонные строки (Template Strings).
Расширенные объектные литералы (Enhanced Object literals).
Деструктуризация (Object Destructuring).
Промисы (Promises).
Генераторы (Generators).
Модули (Modules).
Symbol.
Прокси (Proxies).
Множества (Sets).
Параметры по умолчанию.
Операторы rest и spread.
Блочная область видимости (ключевые слова «let» и «const»).

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

Что такое классы (Classes)?

A

Шаблондля созданияобъектов, описывающая их свойства и методы.

У класса есть гетеры сетеры, constructor, приватные свойства, статические методы

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

Что такое деструктуризация объекта (Object Destructuring)?

A

Извлечения значений объекта или массива.

{{{{{{{
let { firstName, lastName, position, yearHired } = employee
}}}}}}}}

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

Что такое функция обратного вызова (Callback Function)?

A

Функция обратного вызова — это функция, вызов которой отложен на будущее

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

В чем разница между spread-оператором и rest-оператором?

A

(rest - остальные, spread - распространение)

Операторы spread и rest имеют одинаковый синтаксис (“…”). Разница состоит в том, что с помощью spread мы передаем или распространяем данные массива на другие данные:

const myProps = { title: “Заголовок”, description: “Описание” };
return <MyComponent {…myProps} />;

а с помощью rest — получаем все параметры функции и помещаем их в массив (или извлекаем часть параметров).

function showName(firstName, lastName, …titles) {

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

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

A

У каждого примитива, кроме null и undefined, есть объект-обертка.
Объект-обертка - это объект предоставляющий дополнительные методы для работы с примитивом.

Когда мы пытаемся обратится к примитиву как к объекту:
(23.456). toFixed(1);

Интерпретатор временно оборачивает, примитив в объект вызовом new Number(23.456) и потом уже у этого объекта вызывает метод toFixed()

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

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

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

A

Неявное преобразование — это способ приведения значения к другому типу без нашего участия.

Явное преобразование предполагает наше участие в приведении значения к другому типу

Number(‘123’)

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

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

A

Array.isArray(5)

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

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

A

Number.isNaN()

undefined + 1

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

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

A

const o = {
name: ‘Mark’,
greeting(){
return Hi, I'm ${this.name}
}
}

Функция-конструктор:
function Person(name){
this.name = name
}

const mark = new Person(‘Mark’)

Метод Object.create:
const n = {
greeting(){
return Hi, I'm ${this.name}
}
}

const o = Object.create(n)

o.name = ‘Mark’

console.log(o.greeting) // Hi, I’m Mark

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

В чем разница между обычной функцией и функциональным выражением

A

Function extentioin поднимается в отличие от Functioin declaration.

(((((((((((
Вызов notHoistedFunc приведет к ошибке, а вызов hoistedFunc нет, потому что hoistedFunc «всплывает», поднимается в глобальную область видимости, а notHoistedFunc нет.

hoistedFunc()
notHoistedFunc()

function hoistedFunc(){
console.log(‘I am hoisted’)
}

var notHoistedFunc = function(){
console.log(‘I will not be hoisted!’)
}
))))))))))))

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

Что такое запоминание или мемоизация (Memoization)?

A

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

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

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

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

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

A

Ключевое слово «new» используется в функциях-конструкторах для создания нового объекта .
Функция конструктор начинается с большой буквы

(((((((((((((
Обычный синтаксис {…} позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как пользователи, элементы меню и так далее.
Это можно сделать при помощи функции-конструктора и оператора “new”

Допустим, у нас есть такой код:
function Employee(name, position, yearHired){
this.name = name
this.position = position
this.yearHired = yearHired
}

const emp = new Employee(‘Marko Polo’, ‘Software Development’, 2017)

Что происходит когда выполняется new Employee:
Создает пустой объект.
Привязывает к нему значение this.
Выполняется тело функции. Обычно оно модифицирует this, добавляя туда новые свойства.
Возвращается значение this

)))))))))))))

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

‘use strict’ или строгий режим

A

‘use strict’включает строгий режим выполнения JavaScript. Эта строка должна располагаться в самом начале функции
Нет никакого способа отменитьuse strict

  • Нельзя присваивать значение в неопределённую переменную
    x = 5; // ReferenceError: x is not defined
  • Нельзя использовать инструкцию with, eval
  • Нельзя определить повторные свойства в объекте
    var x = {
    a: 1,
    a: 2
    }
  • Нельзя определять функции с повторяющимися аргументами
    function f(a, a) {
    “use strict”;
    } // SyntaxError: Strict mode function may not have duplicate parameter names
  • Нельзя использовать слова зарезервированные для будущего использования (в переменных например)
    implements, let, private, public, yield, interface, package, protected, static
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Модули в js

A

По мере роста нашего приложения, мы обычно хотим разделить его на много файлов, так называемых «модулей».
Модули могут загружать друг друга и использовать директивыexportиimport, чтобы обмениваться функциональностью, вызывать функции одного модуля из другого:
exportотмечает переменные и функции, которые должны быть доступны вне текущего модуля.
importпозволяет импортировать функциональность из других модулей.

В модулях используется:
- ‘use strict’
- Каждый модуль имеет свою собственную область видимости.
- Код в модуле выполняется только один раз при импорте

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

Что такое javascript

A

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

Является реализацией спецификации ECMAScript

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

Переменные в js

A

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

  • Может быть обявлена только 1 раз (var допускает повторное объявление)
  • Имя переменной должно содержать только буквы, цифры или символы$и_. Нелатинские буквы разрешены, но не рекомендуются
  • Существуетсписок зарезервированных слов, которые нельзя использовать в качестве имён
  • Let и const имеют блочную область видимости, var функциональную
  • у var есть hosting, ее опреденение всплывает вверх функции, let const нет
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Типы данных в js

A

Есть восемь основных типов данных в JavaScript. Это
number, BigInt, string, boolean, null, undefined, object, symbol .

BIGINT
BIGINT тип нужен для работы с большими числами (если число боьлше 2 в 252). Работает с целыми числами. На конце числа добавляется n.

null
null это значение задано и оно пустое, не известно

undefined
означает, что «значение не было присвоено».
Если переменная объявлена, но ей не присвоено никакого значения, то её значением будетundefined.

Типobject(объект) – особенный.
Все остальные типы называются «примитивными», потому что их значениями могут быть только простые значения (будь то строка, или число, или что-то ещё). В объектах можно хранить различные типы данных.

symbol
Примитивный тип данных, использующийся для создания уникальных идентификаторов.
Символы создаются вызовом функцииSymbol(), в которую можно передать описание (имя) символа.

((((((((((
Как узнать тип данных? Использовать typeof(имя переменной)
)))))))))

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

Тип данных Symbol

A

«Символ» представляет собой уникальный идентификатор.
В качестве ключей для свойств объекта могут использоваться только строки или символы.

((((
Создаются новые символы с помощью функцииSymbol():
// Создаём новый символ - id
let id = Symbol();
Символы гарантированно уникальны. Даже если мы создадим множество символов с одинаковым описанием, это всё равно будут разные символы. Описание – это просто метка, которая ни на что не влияет.

let id1 = Symbol(“id”);
let id2 = Symbol(“id”);

alert(id1 == id2); // false

Символы не преобразуются автоматически в строки
let id = Symbol(“id”);
alert(id.toString()); // Symbol(id), теперь работает

Symbol.keyFor(), наоборот, принимает глобальный символ и возвращает его имя.

Даже если символы имеют одно и то же имя, это – разные символы. Если мы хотим, чтобы одноимённые символы были равны, то следует использовать глобальный реестр: вызовSymbol.for(key)возвращает (или создаёт) глобальный символ сkeyв качестве имени. Многократные вызовы командыSymbol.forс одним и тем же аргументом возвращают один и тот же символ.
Символы игнорируются циклом for…in.
)))))

34
Q

Базовые операторы. Термины: «унарный», «бинарный», «операнд». Математические операторы. Приведение к числу, унарный +. Инкремент/декремент. Побитовые операторы. Оператор «запятая»

A
  • Операнд– то, к чему применяется оператор. Например, в умножении5 * 2есть два операнда: левый операнд равен5, а правый операнд равен2. Иногда их называют «аргументами» вместо «операндов».
  • Унарнымназывается оператор, который применяется к одному операнду. Например, оператор унарный минус”-“меняет знак числа на противоположный:
    Бинарнымназывается оператор, который применяется к двум операндам.

Поддерживаются следующие математические операторы:
Сложение+,
Вычитание-,
Умножение*,
Деление/,
Взятие остатка от деления%,
Возведение в степень**.
Результатa % b– этоостатокот целочисленного деленияaнаb.
Оператор возведения в степеньa ** bвозводитaв степеньb.
Унарный + это то же самое, что иNumber(…), только короче.

Инкремент/декремент
Инкремент++увеличивает переменную на 1:
Декремент–уменьшает переменную на 1:
Операторы++и–могут быть расположены не только после, но и до переменной.
Когда оператор идёт после переменной — это «постфиксная форма»:counter++.
«Префиксная форма» — это когда оператор идёт перед переменной:++counter.
ПРИМЕР
let counter = 1;
let a = ++counter; // (*)

alert(a); // 2

let counter = 1;
let a = counter++; // (*) меняем ++counter на counter++

alert(a); // 1

Побитые операторы
AND(и) (&)
OR(или) (|)
XOR(побитовое исключающее или) (^)
NOT(не) (~)
LEFT SHIFT(левый сдвиг) («)
RIGHT SHIFT(правый сдвиг) (»)
ZERO-FILL RIGHT SHIFT(правый сдвиг с заполнением нулями) (»>)

Оператор «запятая»
Оператор «запятая» предоставляет нам возможность вычислять несколько выражений, разделяя их запятой,. Каждое выражение выполняется, но возвращается результат только последнего.
Иногда его используют в составе более сложных конструкций, чтобы сделать несколько действий в одной строке.
for (a = 1, b = 3, c = a * b; a < 10; a++) {

}

35
Q

Операторы сравнения

A

Больше/меньше:a > b,a < b.
Больше/меньше или равно:a >= b,a <= b.
Равно:a == b
Не равно. a != b.
Результат сравнения имеет логический тип
Оператор строгого равенства===проверяет равенство без приведения типов. Оператор == проверяет равенство с приведением типов

36
Q

Условное ветвление: if. ’?’ Тернарный оператор

A

Иногда нам нужно выполнить различные инструкции в зависимости от условий. Для этого используем if или тернарный оператор.
Пример
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
__________________
let result = условие ? значение1 : значение2;
__________________
let age = prompt(‘Возраст?’, 18);

let message = (age < 3) ? ‘Здравствуй, малыш!’ :
(age < 18) ? ‘Привет!’ :
(age < 100) ? ‘Здравствуйте!’ :
‘Какой необычный возраст!’;

alert( message );

37
Q

Логические операторы

A

||(ИЛИ)
Если какой-либо из аргументовtrue, он вернётtrue, в противоположной ситуации возвращаетсяfalse.
____________________________________________

&&(И) Оператор И пишется как два амперсанда&& В традиционном программировании И возвращаетtrue, если оба аргумента истинны, а иначе –false
!(НЕ)

Сначала приводит аргумент к логическому типуtrue/false
Затем возвращает противоположное значение.
______________________________________________________

Оператор нулевого слияния (??)
Результат выраженияa ?? bбудет следующим:
еслиaопределено, тоa,
еслиaне определено, тоb.
Иначе говоря, оператор??возвращает первый аргумент, если он неnull/undefined, иначе второй.

38
Q

Циклы while и for

A

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

let i = 0;
while (i < 3) {
// выводит 0, затем 1, затем 2
alert( i );
i++;
}
Проверку условия можно разместить под телом цикла, используя специальный синтаксисdo..while:
let i = 0;
do {
alert( i );
i++;
} while (i < 3);
Цикл «for»
for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2
alert(i);
}
Обычно цикл завершается при вычисленииусловиявfalse.
Но мы можем выйти из цикла в любой момент с помощью специальной директивыbreak. (Работает и в while и в for)
continue– при выполнении цикл не прерывается, а переходит к следующей итерации

39
Q

Конструкция “switch”

A

Конструкцияswitchзаменяет собой сразу несколькоif.
Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами.
Конструкцияswitchимеет один или более блокcaseи необязательный блокdefault.

switch(x) {
case ‘value1’: // if (x === ‘value1’)

[break]

case ‘value2’: // if (x === ‘value2’)

[break]

default:

[break]
}

Можно сгруппировать несколько case. Можно пропустить break;

40
Q

Функции

A

Функция это объект. Позваляет переиспользовать один и тот же код во многих местах.

Функция обладает полным доступом к внешним переменным и может изменять их значение.Внешняя переменная используется, только если внутри функции нет такой локальной переменной .Если одноимённая переменная объявляется внутри функции, тогда она перекрывает внешнюю.

Функции == Комментарии
Функции должны быть короткими и делать только что-то одно. Если это что-то большое, имеет смысл разбить функцию на несколько меньших. Иногда следовать этому правилу непросто, но это определённо хорошее правило. Иногда разработчики называют такой кодсамодокументируемым.

((((((((((((((
function showMessage(параметры) {
alert( ‘Всем привет!’ );
return true;
}
)))))))))))))

41
Q

Синтаксисы создания функций.

A

1Function Declaration(Объявление Функции):
function sayHi() {
alert( “Привет” );
}
2 Function Expression (Функциональное Выражение).
let sayHi = function() {
alert( “Привет” );
};
3 IIFE
(function()=>{
})()
4 Стрелочная
Const asdf = ()=>{

}

42
Q

В чем смысл функции call back

A

Ключевая идея в том, что мы передаём функцию и ожидаем, что она вызовется обратно (от англ. «call back» – обратный вызов) когда-нибудь позже, если это будет необходимо.

43
Q

Стрелочные функции. Отличия от других функции

A
  • У стрелочных функций нет «this»
  • Стрелочные функции не имеют «arguments»
  • Стрелочные функции не допускают дублирования имен аргументов
44
Q

Конструкция “with”

A

Конструкцияwithпозволяет использовать в качестве области видимости для переменных произвольный объект.
В современном JavaScript от этой конструкции отказались.

with(obj) {
…код…
}

((((((((((
Любое обращение к переменной внутриwithсначала ищет её среди свойствobj, а только потом – внеwith.

var a = 5;

var obj = {
a: 10
};

with(obj) {
alert( a ); // 10, из obj
}
)))))))))))

45
Q

Функция “eval”

A

Встроенная функцияevalпозволяет выполнять строку кода.

let result = eval(code);

Пример
let code = ‘alert(“Привет”)’;
eval(code); // Привет

46
Q

Полифилы. Bable

A

Babel

Babel — это компилятор, который преобразует ваш современный JavaScript для запуска в старых браузерах.

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

47
Q

Объекты. Создание объекта. Удаление свойства

A

Один из типов данных. Используется для хранения различных значений.

Создание объекта
let user = new Object(); // синтаксис “конструктор объекта”
let user = {}; // синтаксис “литерал объекта”

Для удаления свойства мы можем использовать оператор delete:
delete user.age;

Проверка существования ключа в обекте
Также существует специальный оператор “in” для проверки существования ключа в объекте.
let user = { name: “John”, age: 30 };
alert( “age” in user ); // true, user.age существует

48
Q

for … in .. ; for … of …

A

for..in последовательно переберёт свойства объекта obj, ключ каждого свойства будет записано в key и вызвано тело цикла.

for (let key in menu) {
// …
}

for of выполняет цикл по значениям перечисляемых свойств итерируемого объекта.
for (let value of menu) {
// …
}

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

К итерируемым объектам относятся: Array, String, Map, Set

49
Q

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

A

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Одно из фундаментальных отличий объектов от примитивов заключается в том, что объекты хранятся и копируются «по ссылке», тогда как примитивные значения: строки, числа, логические значения и т.д. – всегда копируются «как целое значение».

Переменная, которой присвоен объект, хранит не сам объект, а его «адрес в памяти» – другими словами, «ссылку» на него.

Глубокое клонирование:
structuredClone(obj)
lodash.cloneDeep(obj)
JSON.parse(JSON.stringify(obj))
(копирует не все данные, date and function, symbol превратятся в undefined)

Поверхностное клонирование:
Оператор Spread
Object.assign({},{})
Object.create({})

Метод structuredClone может выполнять следующие задачи:
Клонировать бесконечно вложенные объекты и массивы;
Клонировать циклические ссылки;
Клонировать различные типы JS, такие, как Date, Error, RegExp, ArrayBuffer, Blob, File, ImageData

50
Q

Сборка мусора

A

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

(((((((
let john = { name: “John” };

// объект доступен, переменная john — это ссылка на него

// перепишем ссылку
john = null;

// объект будет удалён из памяти

))))))))

51
Q

Опциональная цепочка ‘?.’

A

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

52
Q

Потеря точности с числами

A

Наиболее часто встречающаяся ошибка при работе с числами в JavaScript – это потеря точности.
Посмотрите на это (неверное!) сравнение:
alert( 0.1 + 0.2 == 0.3 ); // false

53
Q

Итерируемые (Перебираемые) объекты.

A

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

Чтобы сделать объект итерируемым (и позволить for..of работать с ним), нам нужно добавить в объект метод с именем Symbol.iterator (специальный встроенный Symbol, созданный как раз для этого).

Когда цикл for..of запускается, он вызывает этот метод один раз (или выдаёт ошибку, если метод не найден). Этот метод должен вернуть итератор – объект с методом next.
Дальше for..of работает только с этим возвращённым объектом.
Когда for..of хочет получить следующее значение, он вызывает метод next() этого объекта.
Результат вызова next() должен иметь вид {done: Boolean, value: any}, где done=true означает, что цикл завершён, в противном случае value содержит очередное значение.

Пример
let range = {
from: 1,
to: 5,
Symbol.iterator {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, затем 2, 3, 4, 5
}

54
Q

Map и Set

A

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

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 есть 3 метода:
map.keys() – возвращает итерируемый объект по ключам,
map.values() – возвращает итерируемый объект по значениям,
map.entries() – возвращает итерируемый объект по парам вида [ключ, значение], этот вариант используется по умолчанию в for..of.

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

55
Q

WeakMap и WeakSet

A

WeakMap – это Map-подобная коллекция, позволяющая использовать в качестве ключей только объекты, и автоматически удаляющая их вместе с соответствующими значениями, как только они становятся недостижимыми иными путями.

WeakSet – это Set-подобная коллекция, которая хранит только объекты и удаляет их, как только они становятся недостижимыми иными путями.

Обе этих структуры данных не поддерживают методы и свойства, работающие со всем содержимым сразу или возвращающие информацию о размере коллекции. Возможны только операции на отдельном элементе коллекции.

WeakMap и WeakSet используются как вспомогательные структуры данных в дополнение к «основному» месту хранения объекта. Если объект удаляется из основного хранилища и нигде не используется, кроме как в качестве ключа в WeakMap или в WeakSet, то он будет удалён автоматически.

let john = { name: “John” };
let weakMap = new WeakMap();
weakMap.set(john, “…”);
john = null; // перезаписываем ссылку на объект
// объект john удалён из памяти!
В map ключ не будет удален из памяти
Можно использовать в кешировании

56
Q

Object.keys, values, entries

A

Для простых объектов доступны следующие методы:

Object.keys(obj) – возвращает массив ключей.
Object.values(obj) – возвращает массив значений.
Object.entries(obj) – возвращает массив пар [ключ, значение].

57
Q

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

A

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

Полный синтаксис для объекта:
let {prop : varName = defaultValue, …rest} = object

Полный синтаксис для массива:
let [item1 = defaultValue, item2, …rest] = array

58
Q

Формат JSON. JSON.stringify, JSON.parse

A

JSON (JavaScript Object Notation) – это общий формат для представления значений и объектов.
JSON.stringify для преобразования объектов в JSON.
JSON.parse для преобразования JSON обратно в объект.

JSON.stringify(value, replacer, space) space – это количество пробелов, используемых для удобного форматирования.
replacer - функция, которая вызвывается для каждого свойства в объекте. служит для изменения значений в строке.

const replacer = (key, value) => {
if (key === “id”) return id-${value}

return value
}

59
Q

Рекурсия

A

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

60
Q

Стeк (LIFO) и Очередь (FIFO)

A

Стек — это структура данных, которая работает по принципу LIFO (Last In, First Out), что означает «последним пришёл — первым вышел». К примеру, вы моете посуду и ставите тарелки друг на друга. Если захотите вытереть их, то первой возьмёте последнюю помытую тарелку. Это и есть принцип работы стека.

Очередь — это структура данных, которая работает по принципу FIFO (First In, First Out), что означает «первым пришёл — первым обслужен». Её можно сравнить с очередью за вкусными пироженками: первый человек, который пришёл, будет первым, кто получит пирожное.

61
Q

Глобальный объект

A

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

Это включает в себя как встроенные объекты, например, Array, так и характерные для окружения свойства, например, window.innerHeight – высота окна браузера.

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

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

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

Для того, чтобы код был проще и в будущем его легче было поддерживать, следует обращаться к свойствам глобального объекта напрямую, как window.x.

62
Q

setTimeout и setInterval

A

setTimeout позволяет вызвать функцию один раз через определённый интервал времени.

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

function sayHi(phrase, who) {
alert( phrase + ‘, ‘ + who );
}
setTimeout(sayHi, 1000, “Привет”, “Джон”); // Привет, Джон

Отмена через clearTimeout
let timerId = setTimeout(…);
clearTimeout(timerId);

63
Q

Флаги и дескрипторы свойств

A

Флаги свойств
Помимо значения value, свойства объекта имеют три специальных атрибута (так называемые «флаги»).

writable – если true, свойство можно изменить, иначе оно только для чтения.
enumerable – если true, свойство перечисляется в циклах, в противном случае циклы его игнорируют.
configurable – если true, свойство можно удалить, а эти атрибуты можно изменять, иначе этого делать нельзя.
Когда мы создаём свойство «обычным способом», все они имеют значение true. Но мы можем изменить их в любое время.

Возвращаемое значение – это объект, так называемый «дескриптор свойства»: он содержит значение свойства и все его флаги.

Метод Object.getOwnPropertyDescriptor позволяет получить полную информацию о свойстве.
Его синтаксис:
let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);
/* дескриптор свойства:
{
“value”: “John”,
“writable”: true,
“enumerable”: true,
“configurable”: true
}
*/

Чтобы изменить флаги, мы можем использовать метод Object.defineProperty.

Object.defineProperty(
user,
“name”,
{
value: “John”
});

((((((((

Глобальное запечатывание объекта
Object.preventExtensions(obj)
Запрещает добавлять новые свойства в объект.
Object.seal(obj)
Запрещает добавлять/удалять свойства. Устанавливает configurable: false для всех существующих свойств.
Object.freeze(obj)
Запрещает добавлять/удалять/изменять свойства. Устанавливает configurable: false, writable: false для всех существующих свойств.

А также есть методы для их проверки:
Object.isExtensible(obj)
Возвращает false, если добавление свойств запрещено, иначе true.
Object.isSealed(obj)
Возвращает true, если добавление/удаление свойств запрещено и для всех существующих свойств установлено configurable: false.
Object.isFrozen(obj)
Возвращает true, если добавление/удаление/изменение свойств запрещено, и для всех текущих свойств установлено configurable: false, writable: false.
На практике эти методы используются редко.

))))))))))

64
Q

Геттеры и сеттеры

A

Свойства-аксессоры представлены методами: «геттер» – для чтения и «сеттер» – для записи. При литеральном объявлении объекта они обозначаются get и set:
let obj = {
get propName() {
// геттер, срабатывает при чтении obj.propName
},
set propName(value) {
// сеттер, срабатывает при записи obj.propName = value
}
};

(((((((((
Есть два типа свойств объекта.
Первый тип это свойства-данные (data properties). Мы уже знаем, как работать с ними. Все свойства, которые мы использовали до текущего момента, были свойствами-данными.
Второй тип свойств мы ещё не рассматривали. Это свойства-аксессоры (accessor properties). По своей сути это функции, которые используются для присвоения и получения значения, но во внешнем коде они выглядят как обычные свойства объекта.
)))))))))))

65
Q

Прототипное наследование. [[Prototype]], .__proto__

A

Prototype есть только у функции конструкторов у классов и function decloration. У остальных типов данных его нету.

__proto__ seter/geter который ссылается на прототип функции конструктора с потощью которой этот объект был создан.

В JavaScript все объекты имеют скрытое свойство [[Prototype]], которое является либо другим объектом, либо null.

Можем использовать obj.__proto__ для доступа к нему (исторически обусловленный геттер/сеттер)

Объект, на который ссылается [[Prototype]], называется «прототипом».

Если мы хотим прочитать свойство obj или вызвать метод, которого не существует у obj, тогда JavaScript попытается найти его в прототипе.

let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // (*)

// теперь мы можем найти оба свойства в rabbit:
alert( rabbit.eats ); // true (**)
alert( rabbit.jumps ); // true

66
Q

Класс: базовый синтаксис

A

В объектно-ориентированном программировании класс – это расширяемый шаблон кода для создания объектов, который устанавливает в них начальные значения (свойства) и реализацию поведения (методы).

class MyClass {
prop = value; // свойство
constructor(…) { // конструктор
// …
}
method(…) {} // метод
get something(…) {} // геттер
set something(…) {} // сеттер
}

В constructor() мы можем инициализировать объект.
constructor запускается с заданным аргументом и сохраняет его в this.name

let user = new MyClass(“Class name”);

67
Q

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

A

Наследование классов – это способ расширения одного класса другим классом.

Таким образом, мы можем добавить новый функционал к уже существующему.

Синтаксис для расширения другого класса следующий: class Child extends Parent.
Давайте создадим class Rabbit, который наследуется от Animal:

class Rabbit extends Animal {
hide() {
alert(${this.name} прячется!);
}
}

let rabbit = new Rabbit(“Белый кролик”);
rabbit.run(5); // Белый кролик бежит со скоростью 5.
rabbit.hide(); // Белый кролик прячется!

68
Q

Статические свойства и методы

A

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

В объявление класса они добавляются с помощью ключевого слова static, например:

class User {
static staticMethod() {
alert(this === User);
}
}

User.staticMethod(); // true

Обычно статические методы используются для реализации функций, которые будут принадлежать классу в целом, но не какому-либо его конкретному объекту.
class Article {
constructor(title, date) {
this.title = title;
this.date = date;
}

static compare(articleA, articleB) {
return articleA.date - articleB.date;
}
}

// использование
let articles = [
new Article(“HTML”, new Date(2019, 1, 1)),
new Article(“CSS”, new Date(2019, 0, 1)),
new Article(“JavaScript”, new Date(2019, 11, 1))
];

articles.sort(Article.compare);

alert( articles[0].title ); // CSS

Статические свойства также возможны, они выглядят как свойства класса, но с static в начале:
class Article {
static publisher = “Илья Кантор”;
}
alert( Article.publisher ); // Илья Кантор
Это то же самое, что и прямое присваивание Article:
Article.publisher = “Илья Кантор”;

Статические свойства и методы наследуются.

69
Q

Приватные и защищённые методы и свойства класса

A

В JavaScript есть два типа полей (свойств и методов) объекта:
Публичные: доступны отовсюду. Они составляют внешний интерфейс. До этого момента мы использовали только публичные свойства и методы.
Приватные: доступны только внутри класса. Они для внутреннего интерфейса.

Приватное свойство и приватный метод

Приватные свойства и методы должны начинаться с #. Они доступны только внутри класса.
class CoffeeMachine {
#waterLimit = 200;

#checkWater(value) {
if (value < 0) throw new Error(“Отрицательный уровень воды”);
if (value > this.#waterLimit) throw new Error(“Слишком много воды”);
}
}

let coffeeMachine = new CoffeeMachine();
// снаружи нет доступа к приватным методам класса
coffeeMachine.#checkWater(); // Error
coffeeMachine.#waterLimit = 1000; // Error

70
Q

Проверка класса: “instanceof”

A

Оператор instanceof позволяет проверить, принадлежит ли объект указанному классу, с учётом наследования.

class Rabbit {}
let rabbit = new Rabbit();

// это объект класса Rabbit?
alert( rabbit instanceof Rabbit ); // true

71
Q

Обработка ошибок, “try..catch”

A

Конструкция try..catch позволяет обрабатывать ошибки во время исполнения кода. Она позволяет запустить код и перехватить ошибки, которые могут в нём возникнуть.

try {
// исполняем код
} catch(err) {
// если случилась ошибка, прыгаем сюда
// err - это объект ошибки
} finally {
// выполняется всегда после try/catch
}

Секций catch или finally может не быть, то есть более короткие конструкции try..catch и try..finally также корректны.

Если объект ошибки не нужен, мы можем пропустить его, используя catch { вместо catch(err) {.

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

72
Q

Что такое промис

A

Промис (Promise) — специальный объект JavaScript, который используется для написания и обработки асинхронного кода.
Асинхронные функции возвращают объект Promise в качестве значения. Внутри промиса хранится результат вычисления, которое может быть уже выполнено или выполнится в будущем.

Промис может находиться в одном из трёх состояний:
pending — стартовое состояние, операция стартовала;
fulfilled — получен результат;
rejected — ошибка.

После создания, промис находится в состоянии ожидания pending. Когда асинхронная операция завершается, функция переводит промис в состояние успеха fulfilled или ошибки rejected.
С помощью методов then(), catch() и finally() мы можем реагировать на изменение состояния промиса и использовать результат его выполнения.

73
Q

Promise API. Promise.all, Promise.allSettled, Promise.race, Promise.any, Promise.resolve/reject,

A

Promise.all(promises) – ожидает выполнения всех промисов и возвращает массив с результатами. Если любой из указанных промисов вернёт ошибку, то результатом работы Promise.all будет эта ошибка, результаты остальных промисов будут игнорироваться.

Promise.allSettled(promises) (добавлен недавно) – ждёт, пока все промисы завершатся и возвращает их результаты в виде массива с объектами, у каждого объекта два свойства:
status: “fulfilled”, если выполнен успешно или “rejected”, если ошибка,
value – результат, если успешно или reason – ошибка, если нет.

Promise.race(promises) – ожидает первый выполненный промис, который становится его результатом, остальные игнорируются.

Promise.any(promises) (добавлен недавно) – ожидает первый успешно выполненный промис, который становится его результатом, остальные игнорируются. Если все переданные промисы отклонены, AggregateError становится ошибкой Promise.any.

Promise.resolve(value) – возвращает успешно выполнившийся промис с результатом value.

Promise.reject(error) – возвращает промис с ошибкой error.

74
Q

Async/await

A

Существует специальный синтаксис для работы с промисами, который называется «async/await»

async перед функцией гарантирует, что эта функция в любом случае вернёт промис.

Ключевое слово await заставит интерпретатор JavaScript ждать до тех пор, пока промис справа от await не выполнится. После чего оно вернёт его результат, и выполнение кода продолжится.

Когда промис завершается успешно, await promise возвращает результат. Когда завершается с ошибкой – будет выброшено исключение. Как если бы на этом месте находилось выражение throw.

75
Q

Генераторы

A

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

function* generateSequence() {
yield 1;
yield 2;
return 3;
}

let generator = generateSequence();

let one = generator.next();

alert(JSON.stringify(one)); // {value: 1, done: false}

Генераторы создаются при помощи функций-генераторов function* f(…) {…}.
Внутри генераторов и только внутри них существует оператор yield.
Внешний код и генератор обмениваются промежуточными результатами посредством вызовов next/yield.

76
Q

Динамические импорты

A

let obj = await import(‘./say.js’);

77
Q

Event loop (цикл событий). Микрозадачи и макрозадачи

A

ЦИКЛ СОБЫТИЙ
Это бесконечный цикл, в котором выполняются различные события. События распределяются по очередям (fifo) microtask и macrotask.

По выполнению сначало выполняется весь синхронный код, затем выполняются все микротаски, Затем выполняется одна макротаска И все заново.
Выполняется весь синхронный код…

Микрозадачи - промисы, функции добавленные с помощью queueMicrotask(func)
MutationObserver

Макрозадачи -
setTimeout
setInterval
Запросы к серверу через XMLHttpRequest или fetch

(((((((
синхронный код у нас попадает в callstack (lifo с помощью которой можно отслеживать порядок вызова функций). Выполняется и убирается из callstack

JS- однопоточный язык. В текущий момент времени может выполняться только одна задача. Но возникает необходимость выполнять код асинхронно (допустим для выполнения трудоемкой функции) ДЛя этого и появляется event loop.

Event loop это бесконечный цикл который выполняет задачи, ожидается задачи если все задачи выполнены, как только они появились опять их выполняет.

Есть основной поток выполнения.
После основного потока выполняются микрозадачи.
После микрозадач выполняются макрозадачи
))))))

78
Q

PROXY

A

Это объект который оборачивается вокруг другого объекта и может перехватывать действия выполняемые с этим объектом.
Мы можем перехватить
- Чтение (get), запись (set), удаление (deleteProperty) свойства
- Вызов функции (apply)
- Оператор new

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

((((((
let proxy = new Proxy(target, handler);

dictionary = new Proxy(dictionary, {
get(target, phrase) { // перехватываем чтение свойства в dictionary
if (phrase in target) { // если перевод для фразы есть в словаре
return target[phrase]; // возвращаем его
} else {
// иначе возвращаем непереведённую фразу
return phrase;
}
}
});
))))))))))

79
Q

Оператор throw

A

Оператор throw генерирует ошибку.

throw new Error(“Данные неполны: нет имени”); // (*)

80
Q

MutationObserver

A

Предоставляет возможность следить за изменениями, вносимыми в дерево DOM. Создает и возвращает новый объект MutationObserver, который будет вызывать указанную функцию обратного вызова при изменении DOM

(((((((
// Callback function to execute when mutations are observed
const callback = (mutationList, observer) => {
for (const mutation of mutationList) {
if (mutation.type === “childList”) {
console.log(“A child node has been added or removed.”);
} else if (mutation.type === “attributes”) {
console.log(The ${mutation.attributeName} attribute was modified.);
}
}
};

// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
)))))))))

81
Q

Reflect

A

Reflect – объект, который позволяет обратиться к методам (set, get) напрямую.

Используют, если нужно перенаправить вызов на оригинальный объект при проксировании

(((((((((((((
let user = {
name: “Вася”,
};

user = new Proxy(user, {
get(target, prop, receiver) {
alert(GET ${prop});
return Reflect.get(target, prop, receiver); // (1)
},
set(target, prop, val, receiver) {
alert(SET ${prop}=${val});
return Reflect.set(target, prop, val, receiver); // (2)
}
});

let name = user.name; // выводит “GET name”
user.name = “Петя”; // выводит “SET name=Петя”
))))))))))))))