Задачи Flashcards

You may prefer our related Brainscape-certified flashcards:
1
Q

// Вопрос, что будет в консоли и почему, как отработает код по шагам

for (var i = 0; i < 5; i++) {
setTimeout(console.log(i), 1000);
}

console.log(‘i after loop’, i)

A

0
1
2
3
4
‘i after loop’, 5

  1. Переменная i инициализируется значением 0.
  2. Условие цикла i < 5 выполняется, так как i равно 0.
  3. Выполняется код внутри цикла:
    - console.log(i) выводит значение i (0) в консоль.
    - setTimeout(console.log(i), 1000) вызывается, но не выполняет задержку, так как аргументом является уже выполненное выражение console.log(i) вместо функции обратного вызова.
    - Выполнение кода продолжается немедленно.
  4. Значение i увеличивается на 1 (i++).
  5. Цикл повторяется с шага 2. Этот процесс повторяется для значений i от 1 до 4.
  6. Каждая итерация сразу выводит значение i в консоль (0, 1, 2, 3, 4).
  7. var создает переменную с областью видимости функции, а не блока. Это означает, что i будет видима и после завершения цикла. После завершения цикла, значение i будет равно 5. Если бы там была переменная let, то последний консоль лог вызвал бы ошибку.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

// Вопрос, что будет в консоли и почему, как отработает код по шагам

for (var i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 1000);
}

console.log(‘i after loop’, i)

A

“i after loop” 5
5
5
5
5
5

  1. Переменная i инициализируется значением 0.
  2. Условие цикла i < 5 проверяется. Так как i равно 0, условие выполняется и цикл начинается.
  3. Выполняется код внутри цикла:
    - setTimeout(() => console.log(i), 1000) вызывается с задержкой в 1000 миллисекунд (1 секунда).
    - Функция обратного вызова, которая выводит значение i в консоль, передается в setTimeout. Здесь используется стрелочная функция для сохранения значения i на момент объявления функции.
    - Но setTimeout запускает таймеры на выполнение функций обратного вызова только после выполнения основного кода.
  4. Значение i увеличивается на 1 (i++).
  5. Цикл проверяет условие i < 5. Поскольку i теперь равно 1, условие выполняется и цикл продолжается с шага 3.
  6. Вторая итерация цикла выполняет те же самые шаги 3-5 с новым значением i. Этот процесс повторяется для оставшихся итераций до тех пор, пока i не станет равным 5.
  7. После завершения цикла, вызывается console.log(‘i after loop’, i), так как i на этот момент уже равно 5 - (‘i after loop’, 5). Потом проходит указанная задержка в 1 секунду.
  8. функции обратного вызова выводят текущее значение i в консоль, которое уже будет равно 5. Это происходит из-за того, что все вызовы функций обратного вызова запускаются после выполнения цикла.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

// Вопрос, что будет в консоли и что будет делать сборщик мусора?

let a = {};
let b = {};
a = b;
b = a;
console.log(“a: “ + a, “b: “ + b);

A

“a: [object Object]” “b: [object Object]”

  1. Создаются две переменные a и b, которые инициализируются пустыми объектами {}.
  2. Затем строка a = b; присваивает переменной a ссылку на объект, на который ссылается переменная b. Оба a и b теперь ссылаются на один и тот же объект в памяти.
  3. Строка b = a; присваивает переменной b ссылку на объект, на который сейчас ссылается переменная a. Поскольку переменные a и b уже ссылаются на один и тот же объект, эта строка кода не имеет эффекта на объекты, с которыми они связаны.
  4. В консоль выводится строка “a: [object Object] b: [object Object]”. Обратите внимание, что “a: “ и “b: “ - это просто части строки, а a и b - это фразы [object Object], которые представляют строковое представление объектов.

На этапе выполнения кода, сборщик мусора в JavaScript будет отслеживать объект, на который первоначально ссылалась переменная a (пустой объект {}). Поскольку нет никаких других ссылок на этот объект, сборщик мусора может определить, что объект больше не доступен для использования, и может освободить память, занимаемую объектом.

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

// Вопрос, что будет в консоли и почему?

function log() {
console.log(a);
var a = 200;
console.log(b);
let b = 400;
}

var b = 100;
log();

A

undefined
ReferenceError: Cannot access ‘b’ before initialization

  1. Объявление функции log() создает блок области видимости для этой функции.
  2. Внутри функции сначала происходит вызов console.log(a). Поскольку var переменные имеют поднятие (hoisting) и не инициализируются до фактического места объявления, переменная a будет существовать в контексте функции log, но ее значение будет undefined. Поэтому на первом console.log(a) будет выведено undefined.
  3. Далее, происходит попытка вызова console.log(b). Однако, переменная b объявлена с использованием let, которые не имеют поднятия (hoisting), и инициализация переменной b происходит только на следующей строке после console.log(b). Поэтому при попытке доступа к переменной b до ее инициализации возникает ReferenceError.
  4. Внутри функции, объявляется переменная a с использованием ключевого слова var, но ей не назначается значение пока.
  5. Затем, происходит попытка вывести значение переменной a с использованием console.log(a). Следует отметить, что переменная a поднимается в начало области видимости блока функции log(), и поэтому значение a на этом этапе является undefined.
  6. Затем, объявляется переменная b с использованием ключевого слова let и ей назначается значение 400.
  7. Однако, перед тем как console.log(b) может быть выполнен, происходит попытка вывести значение переменной b, но возникает ошибка ReferenceError: Cannot access ‘b’ before initialization. Это происходит потому, что переменные, объявленные с использованием let или const, не поднимаются в начало области видимости и их нельзя использовать до объявления. В этом случае, попытка доступа к b происходит до загрузки значения переменной b, и поэтому возникает ошибка.
  8. Затем, в глобальной области видимости, объявляется переменная b со значением 100.
  9. Вызывается функция log(), которая выводит значения a и b соответственно.
  10. console.log(a) внутри функции выведет undefined, так как значение a еще не назначено.
  11. После этого возникнет ошибка ReferenceError: Cannot access ‘b’ before initialization, поскольку console.log(b) также пытается получить доступ к переменной b до ее инициализации.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

// Вопрос, что будет в консоли?

let promise = new Promise(function (resolve, reject) {
resolve(123);
});

console.log(1);
promise.then((result) => {
console.log(result);
})
setTimeout(() => {console.log(2)});
setTimeout(() => {console.log(3)});
console.log(4);

A

1
4
123
2
3

  1. Создается новый объект Promise, с функцией-исполнителем, переданной в конструктор. Функция-исполнитель выполняется немедленно и вызывает resolve(123), что означает успешное выполнение промиса и передачу значения 123.
  2. Вызывается console.log(1), и в консоль выводится число 1.
  3. У промиса вызывается promise.then((result) => { console.log(result); }), что добавляет обработчик для успешного выполнения промиса.
  4. Устанавливаются два таймера с помощью setTimeout(). Они устанавливают задержку в 0ms (почти нулевую задержку, но все же они будут выполнены после синхронного кода).
  5. Вызывается console.log(4), и в консоль выводится число 4.
  6. Начинает выполняться обработка промиса. Обработчик promise.then((result) => { console.log(result); }) планируется для выполнения после успешного выполнения промиса.
  7. Начинаем выполнение таймеров:
    • setTimeout(() => {console.log(2)}) планирует вывод числа 2 в консоль.
    • setTimeout(() => {console.log(3)}) планирует вывод числа 3 в консоль.
  8. Обработчик promise.then((result) => { console.log(result); }) выполняется, выводя число 123 в консоль.
  9. Завершается обработка промиса.
  10. Запланированный вывод числа 2 из таймера выполняется.
  11. Запланированный вывод числа 3 из таймера выполняется.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

// Дан массив, написать функцию sort
// которая вернет новый отсортированный массив
// [0, 0, 0, 0, 1, 1, 1]
// Нельзя использовать сортировку ни в каком виде

let binaryArr = [0, 0, 1, 0, 1, 1, 0];

A

function sort(arr) {
let sortArr = [];
for (let el of arr) {
if (el === 0) sortArr.unshift(0);
if (el === 1) sortArr.push(1);
}
return sortArr;
}

console.log(sort(binaryArr));

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

// Дописать функцию, чтобы она возвращала true для четных и false для нечетных чисел

function even(n) {
if (n === 0) return true;
if (n === 1) return false;
}

console.log(even(123));
console.log(even(122));
console.log(even(-122));
console.log(even(-123));

A

function even(n) {
if (n === 0) return true;
if (n === 1) return false;
if (n < 0){
return even(-n) //если число отрицательное заново вызываем even с противоположным знаком
} else{
return even(n % 2) // в остальных случаях рекурсивно вызываем even для остатка от деления на 2
}
}

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

// Вопрос, что будет в консоли и почему, как отработает код по шагам

for (let i = 0; i < 5; i++) {
setTimeout(console.log(i), 1000);
}

console.log(‘i after loop’, i)

A

0
1
2
3
4
Uncaught ReferenceError: i is not defined

  1. Переменная i инициализируется значением 0.
  2. Условие цикла i < 5 выполняется, так как i равно 0.
  3. Выполняется код внутри цикла:
    - console.log(i) выводит значение i (0) в консоль.
    - setTimeout(console.log(i), 1000) вызывается, но не выполняет задержку, так как аргументом является уже выполненное выражение console.log(i) вместо функции обратного вызова.
    - Выполнение кода продолжается немедленно.
  4. Значение i увеличивается на 1 (i++).
  5. Цикл повторяется с шага 2. Этот процесс повторяется для значений i от 1 до 4.
  6. Каждая итерация выводит значение i в консоль (0, 1, 2, 3, 4).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

// с какой разницей отработают эти два цикла?

for (let i = 0; i < 5; i++) { setTimeout(() => console.log(i), 1000); }

for (var i = 0; i < 5; i++) { setTimeout(() => console.log(i), 1000); }

A

В первом коде, где используется let, каждая итерация цикла создает новую переменную i в блоке видимости цикла. Это означает, что каждый вызов setTimeout будет использовать свою собственную переменную i, соответствующую значению i на каждой итерации. Поэтому код выводит числа от 0 до 4.

Во втором коде, где используется var, переменная i является глобальной переменной, доступной из любого места кода. Все вызовы setTimeout ссылаются на одну и ту же глобальную переменную i. Когда функции setTimeout вызываются после завершения цикла, значение i уже достигло 5 и цикл завершился. В результате, выводится 5 пять раз, потому что все вызовы setTimeout ссылаются на последнее значение i.

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

Напиши цикл с SetTimeout, который выведет в консоль 0, 1, 2, 3, 4 с задержкой в 1 секунду каждое

A

for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000);
}

  1. На первой итерации цикла создается новая переменная i со значением 0. Затем вызывается функция setTimeout с задержкой в 0 секунд и колбэком, который выводит значение i в консоль.
  2. На второй итерации цикла создается новая переменная i со значением 1. Затем вызывается функция setTimeout с задержкой в 1 секунду (i * 1000) и колбэком, который выводит значение i в консоль.
  3. Процесс повторяется для следующих итераций цикла, создавая новую переменную i и устанавливая разные задержки для каждого вызова setTimeout.
  4. Поскольку задержка для каждого вызова setTimeout равна i * 1000, то первый вывод в консоль (с i = 0) произойдет сразу же. Второй вывод (с i = 1) произойдет через 1 секунду после первого вывода. Третий вывод (с i = 2) произойдет через 2 секунды после первого вывода, и так далее.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Напиши код Быстрой сортировки

A

Quick sort

Этот алгоритм состоит из трёх шагов. Сначала из массива нужно выбрать один элемент — его обычно называют опорным. Затем другие элементы в массиве перераспределяют так, чтобы элементы меньше опорного оказались до него, а большие или равные — после. А дальше рекурсивно применяют первые два шага к подмассивам справа и слева от опорного значения.

function quickSort(arr) {
if (!arr.length) return [];
let left = [];
let right = [];
let support = arr[0]; // определяем опору
for (let i = 1; i < arr.length; i++) {
if (arr[i] < support) {
// если элемент меньше опорного - пушим в левый массив
left.push(arr[i]);
} else {
// если элемент больше опорного - пушим в правый массив
right.push(arr[i]);
}
}
return […quickSort(left), support, …quickSort(right)]; //рекурсивно вызываем функцию на каждый подмассив массива
}

В среднем дает O(n log n), в худшем O(n²) к примеру, при переборе отсортированного по возрастанию массива

Стоит помнить, что если опорный элемент выбирается рандомно, то может узудшаться сложность быстрой сортировки. В среднем она показывает O(NlogN) - на каждой итерации идет разделение массива, но если опорным является 1 элемент массива, то сложность становится O(N²)

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

Напиши пузырьковую сортировку

A

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

function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 -i; j++) { //вычитаем количество проходов из внутреннего цикла во избежание ненужных сравнений
if (arr[j + 1] < arr[j]) { // если правое значение меньше левого - меняем местами
let t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
}
return arr;
}

В худшем случае, когда массив уже отсортирован по убыванию, внутренний цикл будет выполнять n итераций для каждого прохода внешнего цикла. Таким образом, общее количество сравнений и перестановок будет равно n * (n - 1), что эквивалентно O(n²)

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

Напиши Сортировку слиянием

A

merge sort
Сортировка слиянием пригодится для таких структур данных, в которых доступ к элементам осуществляется последовательно (например, для потоков). Весь набор данных делится минимум на две группы. Пары значений сравниваются между собой, наименьшее перемещается влево. После сортировки внутри всех пар, сравниваются левые значения двух левых пар. Таким образом, создаётся группа из четырёх значений: два наименьшие — слева, наибольшие — справа. Процесс повторяется до тех пор, пока не останется только один набор.

function mergeSort(array) {
const half = array.length / 2;
if (array.length < 2) {
// Базовый или конечный случай
return array;
}
const left = array.splice(0, half);
return merge(mergeSort(left), mergeSort(array));
}
//
function merge(left, right) {
let arr = [];
while (left.length && right.length) {
// Выход из цикла, если какой-либо из массивов становится пустым
if (left[0] < right[0]) {
//Выбор самого маленького элемента левого и правого подмассивов.
arr.push(left.shift()); // shift() удаляет первый элемент из массива left, а push() добавляет его в конец arr.
} else {
arr.push(right.shift()); //shift() удаляет первый элемент из массива right, а push() добавляет его в конец arr.
}
}
// Объединение оставшихся элементов (на случай, если мы не перебрали весь левый или правый массив)
return […arr, …left, …right];
}

Сложность - O(NlogN). Стоит обозначить, что у этой сортировки нет худшего случая, она всегда будет работать за O(NlogN). Сортировка слиянием требует дополнительной памяти для временного соединения и объединения отсортированных подмассивов. Алгоритм требует дополнительное количество памяти, пропорциональное размеру сортируемого массива. Это может быть проблемой, особенно если у вас ограниченные ресурсы памяти или если вам нужно сортировать очень большие массивы данных. Нужно обратить внимание, чтобы был один читаемый массив и один для записи, которые могли бы меняться, чтобы не затрачивать память.

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

Напиши сортировку выбором

A

Select-sort
В основе сортировки выбором лежит следующий подход: мы находим минимальное значение в структуре данных и помещаем его на первую позицию, затем находим второе минимальное значение и помещаем его на вторую позицию и так далее.
Временная сложность в наилучшем и наихудшем случае — O(n²).

function selectionSort(arr) {
for (let i = 0; i < arr.length; i++) {
let min = i; // указываем индекс внешнего массива как минимум
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// проходим поиском по всему массиву и ищем минимальный элемент из оставшихся. Если элемент меньше, чем тот, который у нас в руках мы меняем минимальный элемент
min = j;
}
}
if (min != i) {
// меняем местами
let tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}

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

Напиши код бинарного поиска

A

Binary Search

Данные должны быть отсортированы
function binarySearch(elem, array) {
let min = 0; // обозначаем левое минимальное значение отсортированного массива
let max = array.length - 1; // обозначаем правое минимальное значение отсортированного массива
let mid;
while (min <= max) { // пока не пройдем весь массив
mid = Math.floor((min + max) / 2); // получаем центральный элемент, округляя в меньшую сторону
if (array[mid] === elem) { // если элементы совпадают возвращаем индекс
return Index: ${mid};
} else if (elem < array[mid]) { // если элемент меньше, чем центральное значение, переназначаем max
max = mid - 1;
} else { // если элемент больше, чем центральное значение, переназначаем min
min = mid + 1;
}
}
return -1; //если элемент не найден возвращаем -1
}

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

Напиши код интерполирующего поиска

A

Interpolation search

Интерполяционный поиск — это улучшенная версия бинарного поиска. Этот алгоритм поиска поиска в отсортированном массиве напоминает метод поиска имени в телефонной книге: на каждом шаге алгоритм вычисляет, где в оставшемся пространстве поиска может находиться целевой элемент на основе значения границ по сравнению с целевым элементом.

function interpolationSearch(elem, array) {
let min = 0; // обозначаем левое минимальное значение отсортированного массива
let max = array.length - 1; // обозначаем правое минимальное значение отсортированного массива
//
while (min <= max && elem >= array[min] && elem <= array[max]) {
// пока не пройдем весь массив и пока искомый элемент находится в пределах минимума и максимума массива
let position =
min +
Math.floor(
(max - min) * ((elem - array[min]) / (array[max] - array[min]))
); // сначала мы получим центральную позицию, а потом будет высчитываться сдвиг (выражение после *)
//
if (array[position] === elem) {
return Index: ${position}; // если элементы совпадают возвращаем индекс
} else if (array[position] < elem) {
min = position + 1;
} else {
max = position - 1;
}
}
return -1; //если элемент не найден возвращаем -1
}

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

Напиши код линейного поиска

A

linear search
Алгоритм линейного поиска (linear search) просто по очереди сравнивает элементы заданного списка с ключом поиска до тех пор, пока не будет найден элемент с указанным значением ключа (успешный поиск) или весь список будет проверен, но требуемый элемент не найден (неудачный поиск).

function linearSearch(elem, array) {
for (let i = 0; i < array.length; i++) {
if (array[i] === elem) {
return Index: ${i};
}
}
return -1; //если элемент не найден возвращаем -1
}

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

// Что выведется в консоль?

const arr = [10, 12, 15, 21];

for (var i = 0; i < arr.length; i++) {
setTimeout(() => {
console.log(Index: ${i}, element: ${arr[i]});
}, 3000);
}

A

“Index: 4, element: undefined”
“Index: 4, element: undefined”
“Index: 4, element: undefined”
“Index: 4, element: undefined”

Внутри функции setTimeout определена анонимная функция без параметров. Внутри этой функции используется доступ к переменной i и элементу массива arr с помощью индекса i.

Однако, у переменной i есть особенность. В JavaScript переменные, объявленные с помощью ключевого слова var, имеют область видимости функции, но не блока. Это означает, что после выполнения цикла переменная i будет равна значению arr.length, так как цикл завершится, когда i станет равной arr.length.

Через 3 секунды после завершения цикла, функции, переданные в setTimeout, будут выполнены все сразу. Но при обращении к переменной i и элементу массива arr[i], значение i будет уже равно arr.length. Поэтому в каждом вызове функции console.log будет выводиться Index: 4, element: undefined.

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

// Что вернет вывод?
console.log(‘my type is’ + typeof + “”);

A

“my type isnumber”

Из-за использования оператора + внутри конкатенации строки пустая строка преобразуется к числу, после чего typeof вернет тип number и произойдет конкатенация строки “my type is” + “number”, что даст в итоге “my type isnumber”.

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

// Что будет выведено в консоль?
console.log(typeof console);

A

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

console.log(typeof console.log); вернет “function”

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

// Что будет выведено в консоль?
console.log(Math.min())
console.log(Math.max())

console.log(Math.min() > Math.max())

A

Если не передать аргументы в Math.min и Math.max, они вернут:
console.log(Math.min()) // Infinity
console.log(Math.max()) // -Infinity

console.log( Math.min() > Math.max() ); // true

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

// Что будет выведено в консоль?

console.log([“5”, “2”].map((el)=> parseInt(el)))
console.log([“5”, “2”].map((el)=> parseInt()))

A

console.log([“5”, “2”].map((el)=> parseInt(el))) // [5,2]

console.log([“5”, “2”].map((el)=> parseInt())) // [NaN,NaN]

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

// Что будет выведено в консоль?

var Image = {
extension: “jpeg”
}

var img = Object.create(Image);
img.size = ‘2mb’;
delete img.extension;
delete img.size;

console.log(img.extension + “, “ + img.size);

A

“jpeg, undefined”

В данном коде определен объект Image с свойством extension равным "jpeg". Затем создается объект img, который наследуется от объекта Image с помощью Object.create().

После этого добавляется свойство size со значением '2mb'. Затем выполняется delete img.extension;, что приводит к удалению свойства extension из объекта img. Однако, свойство extension все еще существует в объекте Image, от которого он был унаследован.

Таким образом, когда мы обращаемся к img.extension, JavaScript ищет это свойство в объекте img. Поскольку оно было удалено, JavaScript затем ищет его в объекте-прототипе Image. И так как свойство extension присутствует в объекте Image, значение "jpeg" возвращается.

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

// Что будет выведено в консоль?

function addBase(base){
return function(num){
return base + num
}
}

var addFive = addBase(5);

console.log(addFive(10))
console.log(addFive(100))
console.log(addFive(-10))

A

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

  1. В функции addBase создается и возвращается анонимная функция, которая принимает один аргумент num.
  2. Внутри анонимной функции происходит сложение аргумента num и переменной base, которая была передана в addBase во время ее вызова.
  3. Переменная addFive получает результат вызова addBase(5). Это означает, что base становится равным 5 в возвращенной функции.
  4. Вызов addFive(10) приводит к выполнению внутренней анонимной функции с аргументом 10. Результат сложения 5 и 10 равен 15, и это значение выводится в консоль.
  5. Вызов addFive(100) приводит к выполнению внутренней анонимной функции с аргументом 100. Результат сложения 5 и 100 равен 105, и это значение выводится в консоль.
  6. Вызов addFive(-10) приводит к выполнению внутренней анонимной функции с аргументом -10. Результат сложения 5 и -10 равен -5, и это значение выводится в консоль.

Таким образом, функция addBase создает замыкание, где возвращаемая функция запоминает значение base и может использовать его каждый раз при вызове. Это позволяет добавлять одну и ту же базовую величину к разным аргументам.

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

Что выведется в консоль?

const f1 = new Promise((f) => {
console.log(“1”);
f(“2”);
})

setTimeout(()=> console.log(“3”), 0);
f1.then((f2)=> console.log(f2));
const f3 = () => console.log(“4”);
f3();

A

“1”
“4”
“2”
“3”

  1. Создается переменная f1, которая является новым экземпляром промиса. Внутри функции-исполнителя промиса происходит вывод в консоль строки “1”, а затем вызывается функция f с аргументом “2”. В промисе нет асинхронных операций или задержек.
  2. Вызывается функция setTimeout с колбэком, который будет выполнен после 0 миллисекунд. В данном случае, колбэк будет выполнен как можно скорее.
  3. Промис f1 разрешается вызовом функции f внутри функции-исполнителя. В этот момент колбэк из функции then будет помещен в очередь микрозадач. Затем выполнение кода продолжается.
  4. Вызывается функция f3 как стрелочная функция. При вызове функции f3 происходит вывод в консоль строки “4”.
  5. Завершается текущий контекст выполнения. В этот момент будет обработана микрозадача из очереди промиса.
  6. Выведется в консоль значение “2”, которое было передано в функцию f при разрешении промиса f1.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Ты получаешь число из которого надо сделать массив.

function numberToArray(x) {

}

const result = [1, 10, 11, 12, 13, 14, 15, 16, 2, 3, 4, 5, 6, 7, 8, 9]
const x = 16

A

function numberToArray(x) {
return Array(x).fill().map((_, index) => index + 1)
}

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

В функцию приходит год, надо посчитать и вернуть количество пятниц 13 в том году.

A

function unluckyDays(year){
let fridayConter = 0;
for(let month = 0; month < 12; month++){
const date = new Date(year, month, 13);
// проверяем, что дата является пятницей и если да, добавляем к каунтеру
if (date.getDay() === 5) {
fridayConter += 1;
}
}
return fridayConter
}

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

Реализовать методы, которые в процессе выполнения строки (2).plus(3).minus(1) дали бы на выходе 4.

A

Number.prototype.plus = function (value) {
return this + value;
}

Number.prototype.minus = function (value) {
return this - value;
}

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

Дана функция, она принимает в качестве аргументов строки ‘’, ‘1’, ‘b’, ‘1c’, реализуйте ее так, что бы она вернула строку ‘1b*1c’

getStr(‘’, ‘1’, ‘b’, ‘1c’); // Output: ‘1b*1c’

A

function getStr(…args) {
return args.slice(1).join(args[0]);
}

console.log(getStr(‘’, ‘1’, ‘b’, ‘1c’)); // Output: ‘1b*1c’

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

Дан массив дат
var arr = [{date: ‘10.01.2017’}, {date: ‘05.11.2016’}, {date: ‘21.12.2002’}];

Надо отсортировать его от ранней даты к поздней.

A

var arr = [{date: ‘10.01.2017’}, {date: ‘05.11.2016’}, {date: ‘21.12.2002’}];

arr.sort(function(a, b) {
// создаем объект даты с правильно расположенными данными
const dateA = new Date(a.date.split(‘.’).reverse().join(‘-‘));
const dateB = new Date(b.date.split(‘.’).reverse().join(‘-‘));

// getTime() возвращает числовое значение, соответствующее указанной дате по всемирному координированному времени.
return dateA.getTime() - dateB.getTime();
});

console.log(arr);

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

Есть несколько слов, надо определить состоят ли они из одних и тех же букв

let arr = [‘kot’, ‘tok’, ‘okt’], // Output: true
let arr1 = [‘kot’, ‘tok’, ‘ott’]; // Output: false

A

let arr = [‘kot’, ‘tok’, ‘okt’], // Output: true
arr1 = [‘kot’, ‘tok’, ‘ott’]; // Output: false

const checkArr = (arr) => {
const sorted = arr.map((el)=> el.split(“”).sort().join(“”))
const first = sorted[0];
return sorted.every((val) => val === first);
}

console.log(checkArr(arr))

32
Q

// Что выведется в консоли?

console.log(1);
setTimeout(function() {
console.log(2);
}, 0)
console.log(3);

A

1
3
2

  1. Сначала выполняется console.log(1), и в консоли будет выведено значение 1.
  2. Затем выполняется setTimeout, но с задержкой 0 миллисекунд. setTimeout помещает функцию обратного вызова в очередь событий и продолжает выполнение кода.
  3. Последней выполняется console.log(3), и в консоли будет выведено значение 3.
  4. Поскольку функция обратного вызова setTimeout имеет задержку 0 миллисекунд, она будет перемещена из очереди событий в стек вызовов, только после того, как текущий стек вызовов будет выполнен. Поэтому значение 2 будет выведено в консоль после значения 3.
33
Q

Напишите простую функцию, чтобы проверить, является ли число целым

A

function isInteger(num) {
return num % 1 === 0;
}

console.log(isInteger(4)); // true
console.log(isInteger(4.2)); // false
console.log(isInteger(-3)); // true

34
Q

Написать код для получения текущего URL

A

Использовать свойство window.location.href - оно возвращает текущий URL, включая протокол, имя хоста, порт (если он есть), путь и параметры запроса. Если необходимо получить только определенную часть URL (например, только путь), можно использовать другие свойства объекта window.location, такие как pathname или search.

const currentUrl = window.location.href;
console.log(currentUrl); // выведет текущий URL в консоль

35
Q

// Что выведется в консоли?

let b = {};
let c;

b.b = 1;
c = b;
c.b = 2;

console.log(‘b.b =’, b.b); // ?
console.log(‘c.b =’, c.b); // ?

A

console.log(‘b.b =’, b.b); // b.b = 2
console.log(‘c.b =’, c.b); // c.b = 2

Так как c и b ссылаются на один и тот же объект.

36
Q

// Что выведется в консоли?

console.log(1)

const a = new Promise((resolve, reject) => resolve(console.log(2)))

a.then(res => console.log(3))

setTimeout(() => {
console.log(4)
}, 0)

console.log(5)

A

1, 2, 5, 3, 4

  1. Сначала будет выполнено console.log(1), и в консоли будет выведено число 1.
  2. Затем будет создан новый промис a, который моментально разрешится с помощью resolve(). В этот момент внутри промиса также будет выполнена console.log(2), и число 2 будет выведено в консоль.
  3. Далее, после создания и разрешения промиса a, будет выполнен метод .then(), который ожидает разрешения промиса a.
  4. В это время будет выполнено console.log(5), и число 5 будет выведено в консоль.
  5. Как только промис a разрешится, метод .then() будет вызван, и console.log(3) выполнится, выводя число 3 в консоль.
  6. Наконец, вне зависимости от задержки времени, переданной в setTimeout(), будет выполнена функция, переданная внутрь этого метода. Это произойдет после завершения текущей итерации Event Loop, и console.log(4) отобразит число 4 в консоли.
37
Q

// какого цвета будут элементы?

<style>

.green { color: green; }
.blue { color: blue; }
</style>

<div>Раз</div>

<div>Два</div>

A

Синего, так как .blue располагается в определении стилей ниже

38
Q

Напиши функцию isPalindrom, которая будет проверять фразу на палиндромность

console.log(isPalindrom(‘А роза упала на лапу Азора’));

A

function isPalindrom(str) {
const filterString = (str) => {
return str.toLowerCase().split(“”).filter((char)=> char !== “ “)
}

const first = filterString(str).join(“”);
const second = filterString(str).reverse().join(“”);

return first === second;
}

console.log(isPalindrom(‘А роза упала на лапу Азора’));

39
Q

Дана строка из открывающих и закрывающих скобок. Надо проверить что на каждую открывающуюся есть закрывающаяся

const str = “())({}}{()][][” //false
const str2 = “()({})” // true

A

const str = “())({}}{()][][” //false
const str2 = “()({})” // true

function checkBrackets(str) {
const stack = [];
const openingBrackets = [’(‘, ‘{‘, ‘[’];
const closingBrackets = [’)’, ‘}’, ‘]’];
for (let i = 0; i < str.length; i++) {
const char = str[i];
if (openingBrackets.includes(char)) {
stack.push(char);
} else if (closingBrackets.includes(char)) {
const matchingOpeningBracket = openingBrackets[closingBrackets.indexOf(char)];
if (stack[stack.length - 1] !== matchingOpeningBracket) {
return false;
}
stack.pop();
}
}
return stack.length === 0;
}

console.log(checkBrackets(str))
console.log(checkBrackets(str2))

40
Q

Напишите код, который при клике на div внутри root будет выводить в консоль его id и будет игнорировать span

<div>
root
<span>id1</span>
<div>
id2
<div>id3</div>
</div>
</div>

A

const root = document.getElementById(‘root’);

root.addEventListener(‘click’, function(event) {
if (event.target.tagName === ‘DIV’) {
console.log(event.target.id);
}
});

41
Q

У нас есть массив с объектами, нам надо переписать его на объект:
var arr = [
{name: ‘width’, value: 10},
{name: ‘height’, value: 20}
] // должно вернуть объект {width: 10, height: 20}

A

var arr = [
{name: ‘width’, value: 10},
{name: ‘height’, value: 20}
]

const getObjectFromArray = (arr) => {
const resObj = {};
for (elem of arr){
resObj[elem.name]=elem.value
}
return resObj;
}

console.log(getObjectFromArray(arr)) // {width: 10, height: 20}

42
Q

// что будет выведено в консоли?

var i = 4;
var array = [];

while (i–) {
(function (i) {
var i = i;
array.push(function() {
return i + i;
});
})(i);
}

console.log([
array0,
array1,
])

A

[6,4]

  1. Объявляется переменная i и устанавливается равной 4.
  2. Создается пустой массив array.
  3. Запускается цикл while, который будет выполняться 4 раза.
  4. Создается новая функция с аргументом i и выполняется немедленно (IIFE - Immediately Invoked Function Expression).
  5. Внутри IIFE определяется переменная i и устанавливается равной текущему значению внешней переменной i.
  6. Внутри IIFE создается функция-замыкание, которая возвращает сумму i и i.
  7. Функция-замыкание добавляется в массив array.
  8. Значение переменной i декрементируется на 1.
  9. Цикл продолжается или прекращается в зависимости от значения i.
  10. Выводится результат выполнения двух функций, полученных из array[0]() и array[1]().
  11. При вызове array[0](), внутри этой функции возвращается сумма 3 и 3, так как i становится 3 после первой итерации цикла. Результат равен 6.
  12. При вызове array[1](), внутри этой функции возвращается сумма 2 и 2, так как i становится 2 после второй итерации цикла. Результат равен 4.
  13. Конечный результат [6, 4] выводится в консоль.

Если коротко:
(function (i) {})(i); создает замыкание, var i = i — уже принадлежат областям видимости в замыканиях.

function() { return i + i; } в начале поищет в своей области видимости i, не найдя, подымится на уровень выше и там найдет его. Из функции вернется сумма, которая будет положена в массив последним элементом.

43
Q

Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта используя функцию

function f() { console.log(this.x); }
var obj = {x: ‘bar’};

A

f.call(obj, a, b);
f.apply(obj, [a, b]);

obj.funk = function f() { console.log(this.x); }
obj.funk();

function f() { console.log(this.x); }.bind(obj, a, b);
f();

44
Q

Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта используя функцию

function f() { console.log(this.x); }
var obj = {x: ‘bar’};

A

function f() { console.log(this.x); }
var obj = {x: ‘bar’};

1. call & apply
f.call(obj); // ‘bar’
f.apply(obj); // ‘bar’

2. bind
var boundFn = f.bind(obj);
boundFn(); // ‘bar’

3. присваивание функции в свойство объекта и вызова этого свойства
obj.f = f
obj.f(); // ‘bar’

или

obj.f = function() {
f.call(this);
};
obj.f(); // ‘bar’

45
Q

// что будет в консоли?

const res = () => {
a = 3; b = “hello”;
}
res()
console.log(a)

A

3, так как переменные без ключевых слов var, let, const создаются в глобальном контексте

46
Q

Что вернёт этот код — typeof (function(){})() и почему?

A

Этот код вернет тип данных "undefined". Причина заключается в том, что функция, определенная с использованием выражения функции, сразу же вызывается с помощью (). Это называется моментальным вызовом функции или IIFE (Immediately Invoked Function Expression).

В данном случае, внутри IIFE создается анонимная функция, и затем она сразу вызывается. Однако, эта анонимная функция не возвращает какое-либо значение явно, поэтому возвращается значение undefined. А затем применяется оператор typeof к этому значению, и результатом будет строка "undefined", указывающая на то, что возвращаемое значение является неопределенным. Так, к примеру,
console.log( typeof (function(){
return null
})()) // вернет object, т.к. null имеет тип object

47
Q

Почему 0.1 + 0.2 даст 0.30000000000000004

A

Это связано с тем, что в JavaScript числа с плавающей запятой представлены с использованием стандарта двоичной арифметики с плавающей запятой (IEEE 754). В этом стандарте числа, которые не могут быть точно представлены в двоичной системе счисления (например, 0.1 и 0.2), могут иметь небольшую погрешность округления при выполнении математических операций.

В конкретном случае, 0.1 и 0.2 не могут быть представлены точно в двоичной системе счисления. Поэтому, при выполнении операции сложения, происходит округление и возникает погрешность. Это приводит к результату 0.30000000000000004 вместо ожидаемого 0.3.

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

var result = (0.1 + 0.2).toFixed(1);
console.log(result); // "0.3"
48
Q

Сделать реверс каждого слова в строке, оставив их на местах

const str = “hello beautiful world” // “olleh lufituaeb dlrow”

A

const str = “hello beautiful world”

const reverseString = (str) => {
return str
.split(“ “)
.map((word) => […word].reverse().join(“”))
.join(“ “);
};

console.log(reverseString(str))

49
Q

Есть два массива, надо отсортировать и вернуть массив имен с учетом того, что массив имен по индексу совпадает с массивом роста

const names = [“Mary”, “John”, “Emma”]
const height = [180, 165, 170]

// [“John”,”Emma”,”Mary”]

A

Вариант 1: через объект

const names = [“Mary”, “John”, “Emma”]
const height = [180, 165, 170]

const sortNamesAndHeight = (names, height) => {
const persons = [];
for( let name of names){
persons.push({name: name, height: height[names.indexOf(name)]})
}

persons.sort((a, b) => a.height - b.height)
return persons.map(item => item.name)
}

console.log(sortNamesAndHeight(names, height))

Вариант 2: через сортировку и индексоф

const names = [“Mary”, “John”, “Emma”]
const height = [180, 165, 170]

const sortNamesAndHeight = (names, height) => {
const sortedNames = […names];
return sortedNames.sort((a, b) => {
const indexA = names.indexOf(a); // получаем индекс в массиве имен у a элемента
const indexB = names.indexOf(b); // получаем индекс в массиве имен у b элемента
return height[indexA] - height[indexB]; //используем для сортировки массива имен массив высот с использованием индексов наших элементов сравнения
});
}

console.log(sortNamesAndHeight(names, height))

Вариант 3: массив с массивами
const names = [“Mary”, “John”, “Emma”]
const height = [180, 165, 170]

const sortNamesAndHeight = (names, heights) => {
const persons = names
.map((name, index) => [name, heights[index]])
.sort(([, heightA], [, heightB]) => heightA - heightB);

return persons.map(([name]) => name);
}
console.log(sortNamesAndHeight(names, height))

50
Q

Есть массив строк, надо найти строк с самым большим количеством слов и вернуть количество слов в ней

const array = [“i love you”, “hello world”, “are you seriously, man?”] // 4

A

const array = [“i love you”, “hello world”, “are you seriously, man?”]

const getMaxCountOfWords = (arr) => {
return array.reduce((acc, string) => {
if (string.split(“ “).length > acc ){
acc = string.split(“ “).length
}
return acc;
}, 0)
}

console.log(getMaxCountOfWords(array)) // 4

51
Q

Напиши кастомную функцию, принимающую строку и возвращающую ее в lowercase

const string = “Are You seriOUsly, mAn?” // “are you seriously, man?”

A

const string = “Are You seriOUsly, mAn?”

const toLowerCaseCustom = (string) => {
let result = “”
for (let i = 0; i < string.length; i+=1){
const charCode = string.charCodeAt(i)
if (charCode >= 65 && charCode <= 90) { //проверяем что попадает в английские буквы большого регистра
result += String.fromCharCode(charCode + 32); //возвращаем
} else {
result += string[i]
}
}
return result;
}

console.log(toLowerCaseCustom(string)) // “are you seriously, man?”

Или еще можно через регулярку
const customToLowerCaseRegex = (str) => {
return str.replace(/[A-Z]/g, (match) => {
return String.fromCharCode(match.charCodeAt(0) + 32);
});
};

const exampleString = “Hello World”;
console.log(customToLowerCaseRegex(exampleString)); // “hello world”

или
Если строка на русском есть метод toLocaleLowerCase
console.log(“АЛФАВИТ”.toLocaleLowerCase()); // ‘алфавит’

52
Q

function makeCounter(count){
return function(){
return count++
}
}

let counter = makeCounter(0);
let counter2 = makeCounter(0);

console.log(counter())
console.log(counter())

console.log(counter2())
console.log(counter2())

A

console.log(counter()) // 0
console.log(counter()) // 1

console.log(counter2()) // 0
console.log(counter2()) // 1

  1. В глобальной области видимости будет создано лексическое окружение, содержащее объявление функции makeCounter и переменные counter и counter2.
  2. Выполнение кода начинается с присваивания переменной counter вызова функции makeCounter(0).
  3. При вызове функции makeCounter(0) будет создано новое лексическое окружение для этого вызова с параметром count, который имеет значение 0. Это лексическое окружение будет храниться в замыкании функции, возвращаемой из makeCounter.
  4. Внутри функции makeCounter создается анонимная функция, которая возвращает значение count++.
  5. Функция makeCounter возвращает эту анонимную функцию в переменную counter.
  6. Процедура повторяется для переменной counter2. Изменение count в counter не влияет на counter2, так как для каждой функции создается свое собственное замыкание и лексическое окружение.
  7. Вызовы console.log(counter()) и console.log(counter2()) будут выполняться независимо друг от друга. При каждом вызове, функция возвращает текущее значение count, а затем увеличивает его на 1.
  8. Таким образом, вывод будет следующим:
    • 0 (поскольку count имеет исходное значение 0), а постфиксный декремент увеличивает count после выполнения
    • 1 (после первого вызова, count увеличивается на 1)
    • 0 (поскольку count в каждой функции имеет свое собственное значение)
    • 1 (после первого вызова, count во второй функции также увеличивается на 1)

https://youtu.be/mI6Jcfsgma4?t=357 подробнее на 6.06

53
Q

function createIncrement() {
let count =0;
function increment(){
count++
}
let message = Count is ${count}
function log(){
console.log(message)
}
return [increment, log]
}

const [incrementFunc, logFunc] = createIncrement();
incrementFunc()
incrementFunc()
incrementFunc()
logFunc() // Что выведется в консоль?

A

“Count is 0”

  1. В глобальной области видимости создается переменная под функцию createIncrement.
  2. Дальше в const [incrementFunc, logFunc] = createIncrement(); вызывается функция и создается ее лексическое окружение.
  3. Внутри функции createIncrement объявляется и инициализируется переменная count со значением 0.
  4. Определена первая вложенная функция increment
  5. Создается переменная message, которой присваивается строковое значение “Count is 0”, где 0 - начальное значение переменной count.
  6. Определена вторая вложенная функция log
  7. Возвращены функции increment и log в виде массива из функции createIncrement.
  8. Функция incrementFunc вызывается три раза, что приводит к увеличению значения переменной count на 1 с каждым вызовом. После этих вызовов значение переменной count станет равным 3.
  9. Функция logFunc вызывается для вывода значения переменной message в консоль.
    - Когда вызывается logFunc(), происходит вызов функции log, определенной внутри createIncrement.
    • В этой функции выводится значение message в консоль. Значение message было присвоено при создании области видимости createIncrement и остается неизменным.
    • Поэтому вывод в консоль будет Count is 0, так как в момент создания области видимости createIncrement count был равен 0.

Чтобы код отработал так, как мы хотим, можно перенести переменную message внутрь функции log, тогда не найдя внутри себя count она пойдет наружу и получит оттуда актуальный count:
function log(){
let message = Count is ${count}
console.log(message)
}

54
Q

// Что будет выведено в консоль?

function fetchData(callback) {
setTimeout(() => {
callback(data);
}, 2000);
}

function processData(data) {
console.log(“Данные обработаны:”, data);
}

fetchData(processData);

const data = { name: “John”, age: 30 };

A

“Данные обработаны:”
{
“name”: “John”,
“age”: 30
}

  1. в глобальной области видимости создается fetchData, потом processData
  2. вызывается fetchData(processData); с аргументом в виде коллбэка. Создается локальная область видимость у этих функций, в первой происходит вызов сеттаймаут.
  3. присваивается значение data = { name: “John”, age: 30 };
  4. Проходит сеттаймаут и вызывается встроенный коллбэк.
55
Q

// что выведется в консоли?

setTimeout(() => console.log(1));

Promise.resolve().then(() => console.log(2));

Promise.resolve().then(() => setTimeout(() => console.log(3)));

setTimeout(() => console.log(4));

A

2
1
4
3

  1. setTimeout ставит переданный колбэк в очередь макрозадач
    - содержимое очереди макрозадач:
    console.log(1)
  2. Promise.resolve().then(() => console.log(2));
    В очередь микрозадач ставится колбэк, выводящий 2
    - содержимое очереди микрозадач:
    console.log(2)
  3. Promise.resolve().then(() => setTimeout(() => console.log(3)));
    В очередь микрозадач ставится колбэк с setTimeout
    - содержимое очереди микрозадач:
    console.log(2); setTimeout(...3)
  4. setTimeout(() => console.log(4));
    setTimeout ставит переданный колбэк в очередь макрозадач
    - содержимое очереди макрозадач:
    console.log(1); console.log(4)

Выполняется очередь микрозадач - выводится 2, происходит вызов setTimeout(() => console.log(3)), которая поставит в конец очереди макрозадач вывод 3.
В очереди макрозадач получается теперь: console.log(1); console.log(4); console.log(3).

56
Q

// Что будет в консоли?
var promise = new Promise(function(res) {
setTimeout(function() {
console.log(1)
res(2)
}, 1000)
})

promise.then(function(res) {
console.log(3)
return res
}).then(console.log)

A

1 3 2

  1. new Promise сразу запускает переданный внутрь коллбэк, там сеттаймаут и он отправляется в очередь макротасков.
    у нас нет задач в стэке. У нас микрозадач, так как промис не получил ответ, так что выполняется макрозадача: console.log(1)
  2. получаем ответ от промиса и вызываем then
  3. в нем console.log(3)
  4. в нем по цепочке console.log с переданным res
57
Q

// Сложно для понимания, задача на всплытие
// Что выведется в консоль?
var a = ‘hello’

function b(){
if (false){
var a = ‘word’
} else{
var b = ‘man’
}
console.log(b)
console.log(a)
}

b()

A

console.log(b) // ‘man’
console.log(a) // undefined

‘man’ понятно, а почему же undefined?
Объявление с var всплывает, даже если блок с if не выполняется var a подымается вверх своей области видимости. Функция сначала ищет переменную внутри своей лексической области видимости, находит ее равную undefined и выводит в консоли. a снаружи останется со своим значением ‘hello’.

function b(){
var a;
var b;
if (false){
var a = ‘word’
} else{
var b = ‘man’
}
console.log(b)
console.log(a)
}

58
Q

// Что выведется в консоль?

let a = ‘hello’

function b(){
if (false){
let a = ‘word’
} else{
let b = ‘man’
console.log(b)
}
console.log(b)
console.log(a)
}

b()

A

“man”
function b() {
if (false) {
let a = ‘word’;
} else {
let b = ‘man’;
console.log(b);
}
console.log(b);
console.log(a);
}
“hello”

59
Q

Напиши полифил apply или опиши словами как бы реализовала его?

A

Полифил:
Function.prototype.myApply = function (context, args) {
// Получаем текущий контекст, если передан, или глобальный объект (globalThis) в противном случае
let currentContext = context || globalThis;
// Создаем случайное значение, которое будет использоваться как уникальное свойство
let uniqueProp = Math.random();
// Генерируем новое значение uniqueProp, пока оно не будет уникальным в текущем контексте
while (currentContext[uniqueProp] !== undefined) {
uniqueProp = Math.random();
}
// Присваиваем функцию, для которой вызывается метод myApply, свойству uniqueProp в текущем контексте
currentContext[uniqueProp] = this;
// Вызываем функцию, сохраненную в uniqueProp свойстве, с переданными аргументами
let result = currentContextuniqueProp;
// Удаляем временное свойство uniqueProp из текущего контекста
delete currentContext[uniqueProp];
return result;
};
printName.myApply(myName, [“Palia”, “India”]);

60
Q

Напиши полифил filter или опиши словами как бы реализовала его?

A

Полифил:
Array.prototype.myFilter = function(callback) {
const results = [];
for (let i = 0; i < this.length; i++) {
const cbResult = callback(this[i], i, this); // Вызов коллбэк-функции для каждого элемента с передачей значения элемента, его индекса и самого массива
if (cbResult) {
results.push(this[i]); // Если коллбэк-функция возвращает истинное значение, добавляем текущий элемент в результаты
}
}
return results; // Возвращаем массив с отфильтрованными результатами
}
const arrData = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const res = arrData.myFilter((element) => element % 2 === 0));
console.log(res);

61
Q

!5 + !5 // Ответ: ?

A

!5 + !5 // Ответ: 0, т.к. из-за логического отрицания преобразуются в булевые значения: false + false => 0 + 0 = 0

62
Q

'3' + undefined; // ответ: ?

A

'3' + undefined; // ответ: “3undefined”, т.к. + используется как оператор конкатенации строк (если хотя бы один из операндов является строкой). Если один из операндов не является строкой, он преобразуется в строку, а затем строки объединяются вместе.

63
Q

'4' - true; // ответ: ?

A

'4' - true; // ответ: 3, т.к. оператор - используется для выполнения арифметической операции вычитания. При выполнении операции вычитания, JavaScript автоматически преобразует операнды в числовой тип данных, если они не являются числами.

64
Q

+!![] // ответ: ?

A

+!![] // ответ: Массивы истинны, поэтому оператор двойного НЕ выдаст истину. Затем символ «плюс» преобразует значение «истина» в его числовое представление: 1.

65
Q

4 + null; // ответ: ?

A

4 + null; // ответ: 4, т.к. если один из операндов оператора + является null или undefined, а другой операнд не является строкой, null или undefined будет преобразован в число 0.

66
Q

4 + undefined; // ответ: ?

A

4 + undefined; // ответ: NaN
Также как и 4 - undefined; и true + undefined; и null + undefined; , так как если один из операндов в арифметической операции (сложение, вычитание и т. д.) является undefined, то результат будет NaN.

67
Q

Number(' ') // ответ: ?

A

Number(' ') // ответ: 0, т.к. пустые строки, строки с пробелами и нулевые значения возвращают 0. В соответствии со спецификацией языка JavaScript, при преобразовании строки в число методом Number(), все пробельные символы в начале и конце строки игнорируются.

68
Q

null + 0 // ответ: ?

A

null + 0 // ответ: 0, т.к. null преобразуется в числовое представление: 0.

69
Q

true + false //ответ: ?

A

true + false //ответ: 1, т.к. при сложении два логических значения преобразуются в их числовые аналоги.

70
Q

!!undefined === false; // ответ: ?

A

!!undefined === false; // ответ: true, т.к. сначала происходит логическое преобразование undefined в falsy значение, а потом сравнение.

71
Q

NaN == NaN // ответ: ?

A

NaN == NaN // false, если один из операндов является NaN, результатом сравнения будет false, даже если другой операнд также равен NaN

72
Q

"10" == 10 // ответ: ?

A

"10" == 10 // true, если операнды имеют разные типы, они будут приведены к числовому типу перед сравнением.

73
Q

null === null // ответ: ?

A

null === null // true, также как и undefined === undefined, однако NaN даже при нестрого равенстве будет false

74
Q

null == undefined // ответ: ?

A

null == undefined // true, если один из операндов является null, а другой операнд равен undefined, результатом будет true.

75
Q

true == "true" // ответ ?

A

true == "true" // ответ false, т.к. преобразуются в числа => получается 1 == NaN ? false

76
Q
A