Interview
Interview
Стек
Стек - это абстрактная структура данных, работающая по принципу "последний
вошел, первый вышел" (LIFO - Last In, First Out). Это означает, что элементы
добавляются и удаляются только с одного конца, называемого вершиной стека.
Типы данныx
Вот основные типы данных в JavaScript:
NULL
Тип данных `null` в JavaScript представляет отсутствие значения или пустоту.
Когда переменная объявлена, но не имеет никакого значения, ей можно
присвоить значение `null`, чтобы указать на отсутствие данных. Например:
```javascript
let x = null;
```
Undefined
В JavaScript тип данных `undefined` обозначает переменную, которая была
объявлена, но ей не было присвоено никакого значения. Когда переменная
объявлена, но не инициализирована, ее значение по умолчанию будет
`undefined`. Например:
```javascript
let x;
console.log(x); // Вывод: undefined
```
```javascript
let obj = {};
console.log(obj.property); // Вывод: undefined
function foo() {
// Функция не содержит return
}
console.log(foo()); // Вывод: undefined
```
Aсинхронность
Aсинхронность в программировании означает, что операции могут выполняться
параллельно или независимо друг от друга, в то время как программа
продолжает работать. В веб-разработке асинхронность часто используется для
выполнения операций, которые могут занимать время, таких как запросы к
серверу, чтение или запись файлов и т. д., без блокировки основного потока
выполнения кода.
В JavaScript основным механизмом асинхронности является использование
колбэков (callbacks), промисов (promises) и асинхронных функций (async/await).
Эти инструменты позволяют управлять асинхронным кодом и обрабатывать
результаты асинхронных операций
Это общий путь для асинхронной итерации, но в реальном коде может быть
различный порядок действий и использование дополнительных инструментов
или библиотек для обработки асинхронности.
1. **Цикл `for`**:
- Цикл `for` в JavaScript используется для выполнения повторяющихся
операций определенное количество раз.
- В классическом синтаксисе `for` определяются три параметра:
инициализация (начальное значение), условие продолжения выполнения цикла
и шаг (выражение итерации).
- Пример:
```javascript
for (let i = 0; i < 5; i++) {
console.log(i);
}
```
2. **`await`**:
- Оператор `await` используется только внутри асинхронных функций
(`async`), чтобы приостановить выполнение функции до тех пор, пока промис,
переданный в `await`, не будет разрешен или отклонен.
- Он позволяет писать асинхронный код так, как если бы он был синхронным,
что делает код более читаемым и понятным.
- Пример:
```javascript
async function fetchData() {
let result = await someAsyncOperation();
console.log(result);
}
```
3. **Асинхронные циклы**:
- Когда вы комбинируете цикл `for` с асинхронными операциями и
оператором `await`, вы можете итерировать асинхронно через коллекции
данных или выполнять асинхронные операции внутри цикла.
- Пример:
```javascript
async function fetchData() {
for (let i = 0; i < 5; i++) {
let result = await someAsyncOperation(i);
console.log(result);
}
}
```
Циклы
Цикл в программировании - это конструкция, которая позволяет выполнять
один и тот же участок кода несколько раз. Циклы полезны для автоматизации
повторяющихся задач. В JavaScript есть несколько типов циклов, включая `for`,
`while` и `do-while`.
1. **Цикл for**:
```javascript
for (начальное_условие; условие_продолжения; выражение_итерации) {
// Код, который нужно выполнить в каждой итерации
}
```
Пример:
```javascript
for (let i = 0; i < 5; i++) {
console.log(i);
}
```
2. **Цикл while**:
```javascript
while (условие) {
// Код, который нужно выполнить в каждой итерации, пока условие истинно
}
```
Пример:
```javascript
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
```
3. **Цикл do-while**:
```javascript
do {
// Код, который нужно выполнить в каждой итерации, пока условие истинно
} while (условие);
```
Пример:
```javascript
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
```
Во всех этих типах циклов код внутри цикла выполняется многократно до тех
пор, пока условие цикла остается истинным. Каждая итерация цикла может
быть настроена с помощью различных условий и выражений итерации, чтобы
обеспечить нужное поведение цикла.
Function
Основные различия между объявлением функции (Function Declaration) и
выражением функции (Function Expression) в JavaScript:
1. **Способ объявления**:
- Объявление функции (Function Declaration) создает функцию как отдельное
выражение в области видимости. Оно начинается с ключевого слова `function`,
за которым следует идентификатор функции и тело функции.
- Выражение функции (Function Expression) создает функцию как часть
выражения, обычно присваивая ее переменной или свойству объекта. Она
начинается с ключевого слова `function`, за которым следует идентификатор
(опционально) и тело функции.
2. **Поднятие (Hoisting)**:
- Объявления функций (Function Declarations) поднимаются вверх в область
видимости, что означает, что их можно использовать до их фактического
объявления в коде.
- Выражения функций (Function Expressions) не поднимаются, что означает,
что их можно использовать только после их фактического объявления в коде.
3. **Использование до объявления**:
- Объявления функций (Function Declarations) можно использовать до их
фактического объявления в коде.
- Выражения функций (Function Expressions) не могут быть использованы до
их фактического объявления в коде.
Примеры:
```javascript
// Function Declaration (Объявление функции)
function sum(a, b) {
return a + b;
}
console.log(sum(2, 3)); // Вывод: 5
1. **Область видимости**:
- `var` имеет функциональную область видимости, что означает, что
переменные, объявленные с помощью `var`, видны внутри всей функции, в
которой они были объявлены, независимо от блока.
- `let` имеет блочную область видимости, что означает, что переменные,
объявленные с помощью `let`, видны только в блоке, в котором они были
объявлены (например, внутри цикла, условного оператора или функции).
2. **Поднятие (Hoisting)**:
- Переменные, объявленные с помощью `var`, поднимаются вверх в
пределах их функциональной области видимости, что означает, что они
доступны для использования до того момента, как они были фактически
объявлены.
- Переменные, объявленные с помощью `let`, не поднимаются, что означает,
что они недоступны до момента их фактического объявления.
3. **Переопределение**:
- Переменные, объявленные с помощью `var`, могут быть переопределены
(переназначены) в пределах их области видимости.
- Переменные, объявленные с помощью `let`, могут быть переназначены, но
не могут быть переопределены в пределах одного блока.
Пример:
```javascript
// Пример с var
var x = 10;
if (true) {
var x = 20;
}
console.log(x); // Вывод: 20
// Пример с let
let y = 10;
if (true) {
let y = 20;
}
console.log(y); // Вывод: 10
```
протоптиное наследование
В JavaScript прототипное наследование - это основной механизм, с помощью
которого объекты наследуют свойства и методы от других объектов. В отличие
от классического наследования, прототипное наследование не использует
классы; вместо этого, каждый объект имеет ссылку на прототип, из которого он
наследует свойства и методы.
```javascript
// Определение прототипа
let animal = {
sound: "Издает звук",
makeSound: function() {
console.log(this.sound);
}
};
https://habr.com/ru/articles/486820/