Published
Edited
May 19, 2021
Insert cell
md`# Questions checkpoint 1`
Insert cell
md`## 1. What is GIT?`

Insert cell
md`Git — распределённая система контроля версий, которая даёт возможность разработчикам отслеживать изменения в файлах и работать над одним проектом совместно с коллегами. Она была разработана в 2005 году Линусом Торвальдсом, создателем Linux, чтобы другие разработчики могли вносить свой вклад в ядро Linux. Git известен своей скоростью, простым дизайном, поддержкой нелинейной разработки, полной децентрализацией и возможностью эффективно работать с большими проектами.

Подход Git к хранению данных похож на набор снимков миниатюрной файловой системы. Каждый раз, когда вы сохраняете состояние своего проекта в Git, система запоминает, как выглядит каждый файл в этот момент, и сохраняет ссылку на этот снимок.`
Insert cell
md`## 2. What is arguments?`
Insert cell
md` Объект arguments — это подобный массиву объект, который содержит аргументы, переданные в функцию.`
Insert cell
{
function func(a, b, c) {
return arguments;
}
return func(1,2,3);
}
Insert cell
md`## 3. How to use 'arguments' in arrow function?`
Insert cell
md` Вместо arguments нужно использовать ...args, который возвращает массив переданных параметров в функцию.`
Insert cell
{
const a = (...args) => {
return args;
}
return a(1,2,3);
}
Insert cell
md`## 4. What are 3 ways to call a function in js?`
Insert cell
{
//As a function
function func1() {
return 'func1';
}
return func1();
}
Insert cell
{
//As a method
const a = {
func2: function () {
return this;
}
}
return a.func2();
}
Insert cell
{
//As a constructor
function Func3(a) {
this.name = name;
return a;
}
return new Func3('Func3');
}
Insert cell
{
//call(this, 1,2,3), aplly(this, [1,2,3]), bind
function func4() {
return this;
}
const newContext = func4.call({name: 'newContext'});
return newContext;
}
Insert cell
md`## 5. What is a difference between arrow function and 'regular' function?`
Insert cell
md`Главное отличие стрелочной функции в том, что ее контекст прибит. У стрелочной функции нет this`
Insert cell
md` ### Table of Contents
1. This value
2. Constructors
3. arguments object
4. Implicit return
5. Methods

Understanding the differences between regular and arrow functions helps choose the right syntax for specific needs.

**this** value inside a regular function is dynamic and depends on the invocation. But **this** inside the arrow function is bound lexically and equals to this of the outer function.

**arguments** object inside the regular functions contains the list of arguments. The arrow function, on the opposite, doesn’t define **arguments** (but you can easily access the arrow function arguments using a rest parameter **...args**).

If the arrow function has one expression, then the expression is returned implicitly, even without using the **return** keyword.

Last but not least, you can define methods using the arrow function syntax inside classes. Fat arrow methods bind **this** value to the class instance.

Anyhow the fat arrow method is invoked, **this** always equals the class instance, which is useful when the methods are used as callbacks.

To understand all types of functions in JavaScript, I recommend checking

Ссылка на нормальную статью [здесь](https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/)
`
Insert cell
md`## 6. What is inheritance?`
Insert cell
md` В плане наследования JavaScript работает лишь с одной сущностью: объектами. Каждый объект имеет внутреннюю ссылку на другой объект, называемый его прототипом. У объекта-прототипа также есть свой собственный прототип и так далее до тех пор, пока цепочка не завершится объектом, у которого свойство prototype равно null. По определению, null не имеет прототипа и является завершающим звеном в цепочке прототипов.

- Наследование свойств

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

- Наследование "методов"

JavaScript не имеет "методов" в смысле, принятом в классической модели ООП. В JavaScript любая функция может быть добавлена к объекту в виде его свойства. Унаследованная функция ведёт себя точно так же, как любое другое свойство объекта, в том числе и в плане "затенения свойств" (property shadowing) или переопределения метода (method overriding).

В области видимости унаследованной функции ссылка this указывает на наследующий объект (на наследника), а не на прототип, в котором данная функция является собственным свойством.`
Insert cell
md`## 7. What are the 3 principles of OOP?`
Insert cell
md`
- Инкапсуляция
- Наследование
- Полиморфизм
`
Insert cell
md`## 8. What is hoisting?`
Insert cell
md`Поднятие (hoisting), hoisting учит, что объявление переменной или функции физически перемещается в начало вашего кода, хотя в действительности этого не происходит. На самом же деле, объявления переменных и функций попадают в память в процессе фазы компиляции, но остаются в коде на том месте, где вы их объявили. Переменная объявлена, но не инициализирована`
Insert cell
md`## 9. What is closure?`
Insert cell
md`A closure is the combination of a function and the lexical environment within which that function was declared private members via closure closure in a loop chaining self-overwriting functions`
Insert cell
Insert cell
md`## 10. Name all datatypes in js`
Insert cell
md`### 7 or 8 datatypes
* String
* Number
* Undefined
* BigInt
* Boolean
* Object
* Symbol
* null (вроде как исключение)
`
Insert cell
md`## 11. What are the differences between Map and WeekMap`
Insert cell
md`
В ES-2015 появились новые типы коллекций в JavaScript: **Set, Map, WeakSet и WeakMap**.

В отличие от объектов, в которых ключами могут быть только строки, в Map ключом может быть произвольное значение.

Для сохранения и чтения значений используются методы **get и set**. И ключи и значения сохраняются **как есть**, без преобразований типов.

Ссылка для прочтения [здесь](https://learn.javascript.ru/set-map)
`
Insert cell
{
let map = new Map();

map.set('1', 'str1'); // ключ-строка
map.set(1, 'num1'); // число
map.set(true, 'bool1'); // булевое значение

// в обычном объекте это было бы одно и то же,
// map сохраняет тип ключа
return map.get(1); // 'num1'
map.get('1') // 'str1'
map.size // 3
// При создании Map можно сразу инициализировать списком значений.
// Объект map с тремя ключами, как и в примере выше:
/*let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);*/
}
Insert cell
md`
Map – коллекция записей вида ключ: значение, лучше Object тем, что перебирает всегда в порядке вставки и допускает любые ключи.
Set – коллекция уникальных элементов, также допускает любые ключи.
Основная область применения Map – ситуации, когда строковых ключей не хватает (нужно хранить соответствия для ключей-объектов), либо когда строковый ключ может быть совершенно произвольным.

К примеру, в обычном объекте Object нельзя использовать «совершенно любые» ключи. Есть встроенные методы, и уж точно есть свойство с названием __proto__, которое зарезервировано системой. Если название ключа даётся посетителем сайта, то он может попытаться использовать такое свойство, заменить прототип, а это, при запуске JavaScript на сервере, уже может привести к серьёзным ошибкам.

WeakMap и WeakSet – «урезанные» по функциональности варианты Map/Set, которые позволяют только «точечно» обращаться к элементам (по конкретному ключу или значению). Они не препятствуют сборке мусора, то есть, если ссылка на объект осталась только в WeakSet/WeakMap – она будет удалена.
`
Insert cell
md`## 12. Which datastructures where introduced in es6?`
Insert cell
md`
В ES-2015 появились новые типы коллекций в JavaScript: **Set, Map, WeakSet и WeakMap**.
`
Insert cell
md`## 13. What are the way to override context in js?`
Insert cell
md`
Функциями **aplly, call, bind**, сделать функцию-обёртку.
`
Insert cell
{
function bind(func, context) {
return function() {
return func.apply(context, arguments);
};
}
}
Insert cell
md`## 14. What is a context?`
Insert cell
md`
Context is related to objects. It refers to the object to which a function belongs.
Контекстом еще часто называют значение переменной this внутри функции.
`
Insert cell
md`## 15. Name 2 sorting algoritms?`
Insert cell
md`
* Bubble Sort - explanation with tested code.
* Selection Sort - explanation with tested code.
* Insertion Sort - explanation with tested code.
* Merger Sort - explanation with tested code.
* Quick Sort - explanation with tested code.
* Heap Sort - explanation with tested code.
* Bucket Sort.
* Shell Sort.
`
Insert cell
md`## 16. What are 2 steps to implement inharitance in es5?`
Insert cell
{
function Car(color) {
this.color = color;
}
function Lada(color) {
Car.call(this, color); // second Step
this.model = 'vesta';
}
Lada.prototype = Object.create(Car.prototype); // first Step
return new Lada('red');
}
Insert cell
md`## 17. What do super keyword do?`
Insert cell
md`
Ключевое слово super используется для вызова функций, принадлежащих родителю объекта.
`
Insert cell
{
class Car {
constructor(color) {
this.color = color;
}
}
class Lada extends Car {
constructor(model, color) {
super(color);
this.model = model;
}
}
const newLada = new Lada('vesta', 'black');
return newLada;
}
Insert cell
md`## 18. What is Object.assign?`
Insert cell
md`Метод Object.assign() используется для копирования значений всех собственных перечисляемых свойств из одного или более исходных объектов в целевой объект. После копирования он возвращает целевой объект.

**Shadow copy of object**
`
Insert cell
md`## 19. What is currying?`
Insert cell
md`
**Каррирование** – это трансформация функций таким образом, чтобы они принимали аргументы не как f(a, b, c), а как f(a)(b)(c).
Каррирование не вызывает функцию. Оно просто трансформирует её.
`
Insert cell
md`## 20. What is the use of isNaN function?`
Insert cell
md`
Функция isNaN() определяет является ли литерал или переменная нечисловым значением (NaN) или нет. При работе с функцией необходимо проявлять осторожность так как она имеет свои особенности
`
Insert cell
{
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true

isNaN(true); // false
isNaN(null); // false
isNaN(37); // false

// strings
isNaN("37"); // false: "37" преобразуется в число 37 которое не NaN
isNaN("37.37"); // false: "37.37" преобразуется в число 37.37 которое не NaN
isNaN(""); // false: пустая строка преобразуется в 0 которое не NaN
isNaN(" "); // false: строка с пробелом преобразуется в 0 которое не NaN
isNaN("37,5"); // true

// Даты
isNaN(new Date()); // false
isNaN(new Date().toString()); // true

// Пример почему использование isNaN не всегда уместно
isNaN("blabla") // true: "blabla" преобразовано в число.
// При парсинге преобразуется в число при неудаче возвращает NaN
}
Insert cell
md`## 21. What are object prototypes?`
Insert cell
md`
Свойство prototype: Где определены унаследованные экземпляры
Итак, где определены наследуемые свойства и методы? Если вы посмотрите на страницу со ссылкой Object, вы увидите в левой части большое количество свойств и методов - это намного больше, чем количество унаследованных членов, доступных для объекта person1. Некоторые из них унаследованы, а некоторые нет - почему это?

Как упоминалось выше, наследованные свойства это те, что определены в свойстве prototype (вы можете называть это подпространством имён), то есть те, которые начинаются с Object.prototype., а не те, которые начинаются с простого Object. Значение свойства prototype - это объект, который в основном представляет собой контейнер для хранения свойств и методов, которые мы хотим наследовать объектами, расположенными дальше по цепочке прототипов.
`
Insert cell
{
Object.prototype.test = function(){
return 'test!';
};
const a = {};
return a.test();
}
Insert cell
md`## 22. What is the difference between var let and const?`
Insert cell
md`
**var**
1. всплывает
2. можно повторно объявлять
3. как глобальная так и локальная видимость

**let** - переменная, которая может быть перезаписана, **const** - нет.

**let И const**
1. всплывает, но при инициализации получим ошибку
2. нельзя объявить повторно
3. блочная видимость
`
Insert cell
md`## 23. What is the rest parameter and spread operator?`
Insert cell
md`
**Spread syntax** позволяет расширить доступные для итерации элементы (например, массивы или строки) в местах
* для функций: где ожидаемое количество аргументов для вызовов функций равно нулю или больше нуля
* для элементов (литералов массива)
* для выражений объектов: в местах, где количество пар "ключ-значение" должно быть равно нулю или больше (для объектных литералов)
`
Insert cell
{
function func(...n) {
return n;
}
const array = func(1,2,3,4,4,5,6,7,8);
return array;
}
Insert cell
md`
Синтаксис **Res syntax (оставшихся параметров)** функции позволяет представлять неограниченное множество аргументов в виде массива.

Существует три основных отличия оставшихся параметров от объекта arguments:

* оставшиеся параметры включают только те, которым не задано отдельное имя, в то время как объект arguments содержит все аргументы, передаваемые в функцию;
* объект arguments не является массивом, в то время как оставшиеся параметры являются экземпляром Array и методы sort, map, forEach или pop могут непосредственно у них использоваться;
* объект arguments имеет дополнительную функциональность, специфичную только для него (например, свойство callee).
`
Insert cell
{
function func(a, b, c, ...n) {
return n;
}
const array = func(1,2,3,4,4,5,6,7,8);
return array;
}
Insert cell
md`## 24. What is a Temporal Dead Zone?`
Insert cell
md`
**Temporal Dead Zone explained**

This is what the TDZ is: **the term to describe the state where variables are un-reachable**. They are in scope, but they aren't declared.

The let and const variables exist in the TDZ from the start of their enclosing scope until they are declared.

You could also say that the variables exist in the TDZ from the place they get bound (when the variable gets bound to the scope it's inside) until it is declared (when a name is reserved in memory for that variable).
`
Insert cell
{
const a = f(); // 1
const b = 2;
function f() {
return b;
} // 2, b is in the TDZ
return a;
}
Insert cell
md`## 25. What is a pure function?`
Insert cell
md`
«Чистые» функции - это любые функции, исходные данные которых получены исключительно из их входных данных и не вызывают побочных эффектов в приложении. Математические функции являются примерами «чистых» функций. «Нечистые» функции бывают разных форм и размеров. Вот некоторые примеры:

* функции, вывод которых зависит от внешнего / глобального состояния;
* функции, которые возвращают разные исходные данные при одинаковых входных;
* функции, которые изменяют состояние приложения;
* функции, которые изменяют «внешний мир».

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

«Чистая» функция - это функция, которая выводит свои данные основываясь исключительно на свои входные данные и не вызывает побочных эффектов в приложении.
`
Insert cell
{
const f = x => x + 1;
return f(4);
}
Insert cell
md`## 26. What is TypeScript and why use it instead of JavaScript?`
Insert cell
md`
TypeScript (TS) – это надмножество JavaScript (JS), среди основных особенностей которого можно отметить возможность явного статического назначения типов, поддержку классов и интерфейсов. Одним из серьёзных преимуществ TS перед JS является возможность создания, в различных IDE, такой среды разработки, которая позволяет, прямо в процессе ввода кода, выявлять распространённые ошибки. Применение TypeScript в больших проектах может вести к повышению надёжности программ, которые, при этом, можно разворачивать в тех же средах, где работают обычные JS-приложения.
`
Insert cell
md`## 27. Cons of TypeScript.`
Insert cell
md`
1. More verbose
2. Language configuration
3. Separate package
`
Insert cell
md`## 28. What are the principles of object-oriented programming supported in TypeScript?`
Insert cell
md`
* Инкапсуляция (строгая типизация ; public, private, protected; get and set)
* Наследование
* Абстракция (ее можно не указывать, наверное) (Interface, abstract class)
* Полиморфизм (method overrides)

[More here:](https://rachelappel.com/2015/01/02/write-object-oriented-javascript-with-typescript/#:~:text=TypeScript%20is%20not%20a%20new,its%20smaller%20and%20cleaner%20syntax.)
`
Insert cell
md`## 29. What is the difference between the keywords 'interface' and 'type' in TypeScript?`
Insert cell
md`
1. Одним из наиболее существенных функциональных отличий между type и interface является то, что, с type у нас может быть объединение нескольких других type - в данном случае это typePetType, который может быть либо IDog, либо ICat, то с interface, данная концепция не представляется возможной. Если мы попытаемся расширить в IPet тип объединения PetType, то увидим, что TypeScript “ругается” - An interface can only extend an object type or intersection of object types with statically known members...
type PetType = IDog | ICat;
interface IPet extends PetType{} // error
2. Ещё одно функциональное различие между interface и type заключается в том, что если у нас два interface с одинаковыми именами, при использовании они будут объединены вместе. Мы получим доступ к свойствам a и b.
interface Foo {
a: string;
}
interface Foo {
b: string;
}

let foo: Foo;

foo.a
foo.b
Это то, что types не поддерживают. Если мы сделаем тоже самое с types, то получим ошибку - Duplicateidentifier 'Foo'.
type Foo = {
a: string;
}

type Foo = {
b: string;
}

let foo: Foo;
`
Insert cell
md`## 30. How do I make all interface properties optional?`
Insert cell
md`
Интерфейсы с необязательными свойствами записываются подобно обычным, но каждое опциональное свойство помечается символом ? в конце имени.
`
Insert cell
{
interfaceSquareConfig {
color?: string;
width?: number;
}
}
Insert cell
md`## 31. What is an enum type in TypeScript?`
Insert cell
md`
Перечисления позволяют определить набор именованных числовых констант. Они определяются используя ключевое слово enum.

Read more [here](http://typescript-lang.ru/docs/Enums.html or https://www.typescriptlang.org/docs/handbook/enums.html)
`
Insert cell
{
enum Direction {
Up = 1,
Down,
Left,
Right
}
}
Insert cell
md`## 32. What are generics?`
Insert cell
md`
Один из главных инструментов для создания компонентов, предназначенных для повторного использования, являются обобщения (также известные как шаблоны или дженерики). Они позволяют создавать компоненты, способные работать с различными типами, а не только с каким-то одним. Это позволяет применять такие компоненты и использовать свои типы.
`
Insert cell
{
let anotherArray: Array<number> = [1, 2, 3, 4];
function identity<Type>(arg: Type): Type {
return arg;
}
class GenericNumber<NumType> {
zeroValue: NumType;
add: (x: NumType, y: NumType) =>NumType;
}

}
Insert cell
md`## 33. How do I reload a base class method?`
Insert cell
md`
A derived class can also override a base class field or property. You can use the super. syntax to access base class methods. Note that because JavaScript classes are a simple look up object, there is no notion of a “superfield”.
TypeScriptenforcesthat a derivedclassisalways a subtypeofitsbaseclass.

`
Insert cell
md`## 34. What are the ways to declare an array in TypeScript?`
Insert cell
md`
TypeScript, like JavaScript, allows you to work with arrays of values. Array types can be written in one of two ways.
1. Youusethetypeoftheelementsfollowedby [] todenoteanarrayofthatelementtype:
let list: number[] = [1, 2, 3];
2. Uses a generic array type, Array<elemType>:
let list: Array<number> = [1, 2, 3];
`
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more