Задачи Flashcards
// Вопрос, что будет в консоли и почему, как отработает код по шагам
for (var i = 0; i < 5; i++) {
setTimeout(console.log(i), 1000);
}
console.log(‘i after loop’, i)
0
1
2
3
4
‘i after loop’, 5
- Переменная
i
инициализируется значением 0. - Условие цикла
i < 5
выполняется, так какi
равно 0. - Выполняется код внутри цикла:
-console.log(i)
выводит значениеi
(0) в консоль.
-setTimeout(console.log(i), 1000)
вызывается, но не выполняет задержку, так как аргументом является уже выполненное выражениеconsole.log(i)
вместо функции обратного вызова.
- Выполнение кода продолжается немедленно. - Значение
i
увеличивается на 1 (i++
). - Цикл повторяется с шага 2. Этот процесс повторяется для значений
i
от 1 до 4. - Каждая итерация сразу выводит значение
i
в консоль (0, 1, 2, 3, 4). -
var
создает переменную с областью видимости функции, а не блока. Это означает, чтоi
будет видима и после завершения цикла. После завершения цикла, значениеi
будет равно 5. Если бы там была переменная let, то последний консоль лог вызвал бы ошибку.
// Вопрос, что будет в консоли и почему, как отработает код по шагам
for (var i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 1000);
}
console.log(‘i after loop’, i)
“i after loop” 5
5
5
5
5
5
- Переменная
i
инициализируется значением 0. - Условие цикла
i < 5
проверяется. Так какi
равно 0, условие выполняется и цикл начинается. - Выполняется код внутри цикла:
-setTimeout(() => console.log(i), 1000)
вызывается с задержкой в 1000 миллисекунд (1 секунда).
- Функция обратного вызова, которая выводит значениеi
в консоль, передается вsetTimeout
. Здесь используется стрелочная функция для сохранения значенияi
на момент объявления функции.
- НоsetTimeout
запускает таймеры на выполнение функций обратного вызова только после выполнения основного кода. - Значение
i
увеличивается на 1 (i++
). - Цикл проверяет условие
i < 5
. Посколькуi
теперь равно 1, условие выполняется и цикл продолжается с шага 3. - Вторая итерация цикла выполняет те же самые шаги 3-5 с новым значением
i
. Этот процесс повторяется для оставшихся итераций до тех пор, покаi
не станет равным 5. - После завершения цикла, вызывается console.log(‘i after loop’, i), так как i на этот момент уже равно 5 - (‘i after loop’, 5). Потом проходит указанная задержка в 1 секунду.
- функции обратного вызова выводят текущее значение
i
в консоль, которое уже будет равно 5. Это происходит из-за того, что все вызовы функций обратного вызова запускаются после выполнения цикла.
// Вопрос, что будет в консоли и что будет делать сборщик мусора?
let a = {};
let b = {};
a = b;
b = a;
console.log(“a: “ + a, “b: “ + b);
“a: [object Object]” “b: [object Object]”
- Создаются две переменные a и b, которые инициализируются пустыми объектами {}.
- Затем строка a = b; присваивает переменной a ссылку на объект, на который ссылается переменная b. Оба a и b теперь ссылаются на один и тот же объект в памяти.
- Строка b = a; присваивает переменной b ссылку на объект, на который сейчас ссылается переменная a. Поскольку переменные a и b уже ссылаются на один и тот же объект, эта строка кода не имеет эффекта на объекты, с которыми они связаны.
- В консоль выводится строка “a: [object Object] b: [object Object]”. Обратите внимание, что “a: “ и “b: “ - это просто части строки, а a и b - это фразы [object Object], которые представляют строковое представление объектов.
На этапе выполнения кода, сборщик мусора в JavaScript будет отслеживать объект, на который первоначально ссылалась переменная a (пустой объект {}). Поскольку нет никаких других ссылок на этот объект, сборщик мусора может определить, что объект больше не доступен для использования, и может освободить память, занимаемую объектом.
// Вопрос, что будет в консоли и почему?
function log() {
console.log(a);
var a = 200;
console.log(b);
let b = 400;
}
var b = 100;
log();
undefined
ReferenceError: Cannot access ‘b’ before initialization
- Объявление функции log() создает блок области видимости для этой функции.
- Внутри функции сначала происходит вызов
console.log(a)
. Посколькуvar
переменные имеют поднятие (hoisting) и не инициализируются до фактического места объявления, переменнаяa
будет существовать в контексте функцииlog
, но ее значение будетundefined
. Поэтому на первомconsole.log(a)
будет выведеноundefined
. - Далее, происходит попытка вызова
console.log(b)
. Однако, переменнаяb
объявлена с использованиемlet
, которые не имеют поднятия (hoisting), и инициализация переменнойb
происходит только на следующей строке послеconsole.log(b)
. Поэтому при попытке доступа к переменнойb
до ее инициализации возникает ReferenceError. - Внутри функции, объявляется переменная a с использованием ключевого слова var, но ей не назначается значение пока.
- Затем, происходит попытка вывести значение переменной a с использованием console.log(a). Следует отметить, что переменная a поднимается в начало области видимости блока функции log(), и поэтому значение a на этом этапе является undefined.
- Затем, объявляется переменная b с использованием ключевого слова let и ей назначается значение 400.
- Однако, перед тем как console.log(b) может быть выполнен, происходит попытка вывести значение переменной b, но возникает ошибка ReferenceError: Cannot access ‘b’ before initialization. Это происходит потому, что переменные, объявленные с использованием let или const, не поднимаются в начало области видимости и их нельзя использовать до объявления. В этом случае, попытка доступа к b происходит до загрузки значения переменной b, и поэтому возникает ошибка.
- Затем, в глобальной области видимости, объявляется переменная b со значением 100.
- Вызывается функция log(), которая выводит значения a и b соответственно.
- console.log(a) внутри функции выведет undefined, так как значение a еще не назначено.
- После этого возникнет ошибка ReferenceError: Cannot access ‘b’ before initialization, поскольку console.log(b) также пытается получить доступ к переменной b до ее инициализации.
// Вопрос, что будет в консоли?
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);
1
4
123
2
3
- Создается новый объект Promise, с функцией-исполнителем, переданной в конструктор. Функция-исполнитель выполняется немедленно и вызывает resolve(123), что означает успешное выполнение промиса и передачу значения 123.
- Вызывается
console.log(1)
, и в консоль выводится число 1. - У промиса вызывается promise.then((result) => { console.log(result); }), что добавляет обработчик для успешного выполнения промиса.
- Устанавливаются два таймера с помощью
setTimeout()
. Они устанавливают задержку в 0ms (почти нулевую задержку, но все же они будут выполнены после синхронного кода). - Вызывается
console.log(4)
, и в консоль выводится число 4. - Начинает выполняться обработка промиса. Обработчик promise.then((result) => { console.log(result); }) планируется для выполнения после успешного выполнения промиса.
- Начинаем выполнение таймеров:
- setTimeout(() => {console.log(2)}) планирует вывод числа 2 в консоль.
- setTimeout(() => {console.log(3)}) планирует вывод числа 3 в консоль.
- Обработчик promise.then((result) => { console.log(result); }) выполняется, выводя число 123 в консоль.
- Завершается обработка промиса.
- Запланированный вывод числа 2 из таймера выполняется.
- Запланированный вывод числа 3 из таймера выполняется.
// Дан массив, написать функцию sort
// которая вернет новый отсортированный массив
// [0, 0, 0, 0, 1, 1, 1]
// Нельзя использовать сортировку ни в каком виде
let binaryArr = [0, 0, 1, 0, 1, 1, 0];
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));
// Дописать функцию, чтобы она возвращала 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));
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
}
}
// Вопрос, что будет в консоли и почему, как отработает код по шагам
for (let i = 0; i < 5; i++) {
setTimeout(console.log(i), 1000);
}
console.log(‘i after loop’, i)
0
1
2
3
4
Uncaught ReferenceError: i is not defined
- Переменная
i
инициализируется значением 0. - Условие цикла
i < 5
выполняется, так какi
равно 0. - Выполняется код внутри цикла:
-console.log(i)
выводит значениеi
(0) в консоль.
-setTimeout(console.log(i), 1000)
вызывается, но не выполняет задержку, так как аргументом является уже выполненное выражениеconsole.log(i)
вместо функции обратного вызова.
- Выполнение кода продолжается немедленно. - Значение
i
увеличивается на 1 (i++
). - Цикл повторяется с шага 2. Этот процесс повторяется для значений
i
от 1 до 4. - Каждая итерация выводит значение
i
в консоль (0, 1, 2, 3, 4).
// с какой разницей отработают эти два цикла?
for (let i = 0; i < 5; i++) { setTimeout(() => console.log(i), 1000); }
for (var i = 0; i < 5; i++) { setTimeout(() => console.log(i), 1000); }
В первом коде, где используется let, каждая итерация цикла создает новую переменную i в блоке видимости цикла. Это означает, что каждый вызов setTimeout будет использовать свою собственную переменную i, соответствующую значению i на каждой итерации. Поэтому код выводит числа от 0 до 4.
Во втором коде, где используется var, переменная i является глобальной переменной, доступной из любого места кода. Все вызовы setTimeout ссылаются на одну и ту же глобальную переменную i. Когда функции setTimeout вызываются после завершения цикла, значение i уже достигло 5 и цикл завершился. В результате, выводится 5 пять раз, потому что все вызовы setTimeout ссылаются на последнее значение i.
Напиши цикл с SetTimeout, который выведет в консоль 0, 1, 2, 3, 4 с задержкой в 1 секунду каждое
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000);
}
- На первой итерации цикла создается новая переменная i со значением 0. Затем вызывается функция setTimeout с задержкой в 0 секунд и колбэком, который выводит значение i в консоль.
- На второй итерации цикла создается новая переменная i со значением 1. Затем вызывается функция setTimeout с задержкой в 1 секунду (i * 1000) и колбэком, который выводит значение i в консоль.
- Процесс повторяется для следующих итераций цикла, создавая новую переменную i и устанавливая разные задержки для каждого вызова setTimeout.
- Поскольку задержка для каждого вызова setTimeout равна i * 1000, то первый вывод в консоль (с i = 0) произойдет сразу же. Второй вывод (с i = 1) произойдет через 1 секунду после первого вывода. Третий вывод (с i = 2) произойдет через 2 секунды после первого вывода, и так далее.
Напиши код Быстрой сортировки
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²)
Напиши пузырьковую сортировку
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²)
Напиши Сортировку слиянием
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). Сортировка слиянием требует дополнительной памяти для временного соединения и объединения отсортированных подмассивов. Алгоритм требует дополнительное количество памяти, пропорциональное размеру сортируемого массива. Это может быть проблемой, особенно если у вас ограниченные ресурсы памяти или если вам нужно сортировать очень большие массивы данных. Нужно обратить внимание, чтобы был один читаемый массив и один для записи, которые могли бы меняться, чтобы не затрачивать память.
Напиши сортировку выбором
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;
}
Напиши код бинарного поиска
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
}
Напиши код интерполирующего поиска
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
}
Напиши код линейного поиска
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
}
// Что выведется в консоль?
const arr = [10, 12, 15, 21];
for (var i = 0; i < arr.length; i++) {
setTimeout(() => {
console.log(Index: ${i}, element: ${arr[i]}
);
}, 3000);
}
“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
.
// Что вернет вывод?
console.log(‘my type is’ + typeof + “”);
“my type isnumber”
Из-за использования оператора +
внутри конкатенации строки пустая строка преобразуется к числу, после чего typeof вернет тип number и произойдет конкатенация строки “my type is” + “number”, что даст в итоге “my type isnumber”.
// Что будет выведено в консоль?
console.log(typeof console);
Вернет object
Объект console
предоставляет доступ к консоли разработчика в браузере, где можно выводить различные сообщения, отладочную информацию и другую информацию. Все методы и свойства console
доступны через этот объект.
console.log(typeof console.log); вернет “function”
// Что будет выведено в консоль?
console.log(Math.min())
console.log(Math.max())
console.log(Math.min() > Math.max())
Если не передать аргументы в Math.min и Math.max, они вернут:
console.log(Math.min()) // Infinity
console.log(Math.max()) // -Infinity
console.log( Math.min() > Math.max() ); // true
// Что будет выведено в консоль?
console.log([“5”, “2”].map((el)=> parseInt(el)))
console.log([“5”, “2”].map((el)=> parseInt()))
console.log([“5”, “2”].map((el)=> parseInt(el))) // [5,2]
console.log([“5”, “2”].map((el)=> parseInt())) // [NaN,NaN]
// Что будет выведено в консоль?
var Image = {
extension: “jpeg”
}
var img = Object.create(Image);
img.size = ‘2mb’;
delete img.extension;
delete img.size;
console.log(img.extension + “, “ + img.size);
“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"
возвращается.
// Что будет выведено в консоль?
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))
Данный код демонстрирует пример замыкания или функции, возвращающей другую функцию.
- В функции
addBase
создается и возвращается анонимная функция, которая принимает один аргументnum
. - Внутри анонимной функции происходит сложение аргумента
num
и переменнойbase
, которая была передана вaddBase
во время ее вызова. - Переменная
addFive
получает результат вызоваaddBase(5)
. Это означает, чтоbase
становится равным 5 в возвращенной функции. - Вызов
addFive(10)
приводит к выполнению внутренней анонимной функции с аргументом 10. Результат сложения 5 и 10 равен 15, и это значение выводится в консоль. - Вызов
addFive(100)
приводит к выполнению внутренней анонимной функции с аргументом 100. Результат сложения 5 и 100 равен 105, и это значение выводится в консоль. - Вызов
addFive(-10)
приводит к выполнению внутренней анонимной функции с аргументом -10. Результат сложения 5 и -10 равен -5, и это значение выводится в консоль.
Таким образом, функция addBase
создает замыкание, где возвращаемая функция запоминает значение base
и может использовать его каждый раз при вызове. Это позволяет добавлять одну и ту же базовую величину к разным аргументам.
Что выведется в консоль?
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();
“1”
“4”
“2”
“3”
- Создается переменная
f1
, которая является новым экземпляром промиса. Внутри функции-исполнителя промиса происходит вывод в консоль строки “1”, а затем вызывается функцияf
с аргументом “2”. В промисе нет асинхронных операций или задержек. - Вызывается функция
setTimeout
с колбэком, который будет выполнен после 0 миллисекунд. В данном случае, колбэк будет выполнен как можно скорее. - Промис
f1
разрешается вызовом функцииf
внутри функции-исполнителя. В этот момент колбэк из функцииthen
будет помещен в очередь микрозадач. Затем выполнение кода продолжается. - Вызывается функция
f3
как стрелочная функция. При вызове функцииf3
происходит вывод в консоль строки “4”. - Завершается текущий контекст выполнения. В этот момент будет обработана микрозадача из очереди промиса.
- Выведется в консоль значение “2”, которое было передано в функцию
f
при разрешении промисаf1
.
Ты получаешь число из которого надо сделать массив.
function numberToArray(x) {
…
}
const result = [1, 10, 11, 12, 13, 14, 15, 16, 2, 3, 4, 5, 6, 7, 8, 9]
const x = 16
function numberToArray(x) {
return Array(x).fill().map((_, index) => index + 1)
}
В функцию приходит год, надо посчитать и вернуть количество пятниц 13 в том году.
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
}
Реализовать методы, которые в процессе выполнения строки (2).plus(3).minus(1) дали бы на выходе 4.
Number.prototype.plus = function (value) {
return this + value;
}
Number.prototype.minus = function (value) {
return this - value;
}
Дана функция, она принимает в качестве аргументов строки ‘’, ‘1’, ‘b’, ‘1c’, реализуйте ее так, что бы она вернула строку ‘1b*1c’
getStr(‘’, ‘1’, ‘b’, ‘1c’); // Output: ‘1b*1c’
function getStr(…args) {
return args.slice(1).join(args[0]);
}
console.log(getStr(‘’, ‘1’, ‘b’, ‘1c’)); // Output: ‘1b*1c’
Дан массив дат
var arr = [{date: ‘10.01.2017’}, {date: ‘05.11.2016’}, {date: ‘21.12.2002’}];
Надо отсортировать его от ранней даты к поздней.
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);