/javascript-fundamentals

JS Fundmetals tasks

Primary LanguageJavaScript

Требования

Все задания должны быть выполнены отдельным юнит тестом на основе заготовки Unit testing. Для тестирования мы будем использовать framework Jest Для знакомства с Jest прочитайте 2 раздела документации Getting started и Using matchers

Начало работы

  • Установить nodejs, предпочтительнее установить LTS версию https://nodejs.org/en/ Если у вас установлена node.js - пропустите этот шаг
  • Форкнуть данный проект https://help.github.com/en/articles/fork-a-repo
  • После того, как вы форкнули проект, он будет добавлен к вам на github-e. Склонируйте проект из своего профиля
  • Откройте консоль(терминал, cmd)
  • Перейдите в дирикторию проекта
  • Выполните команду npm install

Как запустить тесты

Выполните в консоли команду npm run test#.# где #.#  подгруппы задания Пример: для 1.1 Базовые типы данных следует выполнить npm run test1.1

Для того, чтобы выполнить только конкретный тест из файла, можно после it добавить "only" Пример:

describe("Test group", () => {
  it("Test1", () => {
    expect(true).toBe(true);
  });

  // Only run this test
  it.only("Test2", () => {
    expect(true).toBe(true);
  });

  it("Test3", () => {
    expect(true).toBe(true);
  });
});

Также можно использовать встроенные средства для работы с тестами в вашем редакторе. Для vs code подойдет плагин jest runner

Как выполнять задания

Для каждого задания указан файл шаблона, в котором вам следует писать код. Каждый файл включает группу заданий (блок describe), Каждое задание это один тест (блок it)

Пример: файл шаблона example.test.js содержит одну группу заданий Example с 2-мя заданиями

    describe('Example', () => {
        it('Should multiply 2 numbers', () => {
           expect(/* multiply(1, 2) */).toBe(2);
           expect(/* multiply(3, 5) */).toBe(15);
            // TODO: Write additional tests
        });

        it('Should define one number and one string variable', () => {
            expect(/* typeof num */).toBe('number');
            expect(/* ??? str */).toBe('string')
        });
    });

Чтобы запустить тесты следует выполнить команду jest example.test.js. Результатом будет два непройденых теста

Failed example

Вносим следующие правки:

describe("Example", () => {
  it("Should multiply 2 numbers", () => {
    function multiply(a, b) {
      return a * b;
    }

    expect(multiply(1, 2)).toBe(2);
    expect(multiply(3, 5)).toBe(15);
    expect(multiply(-3, 5)).toBe(-15);
    expect(multiply(0, 5)).toBe(0);
  });

  it("Should define one number and one string variable", () => {
    const num = 10;
    const str = "hello";

    expect(typeof num).toBe("number");
    expect(typeof str).toBe("string");
  });
});

Запускаем тесты повторно и получаем результат - все тесты пройдены

Passed example

Справочные ресурсы

Как синхронизироваться с основным репозиторием

Задания

1 Операторы и типы данных

1.1 Базовые типы данных

В качестве шаблона и уточнения заданий использовать файл datatypes.test.js

Запуск теста npm run test1.1

  • Объявить 2 переменных a и b типа boolean с разными значениями. Убедиться, что тип переменных boolean

  • Написать 4 выражения с двумя булевскими операндами, используя следующие операторы: логическое И, логическое ИЛИ, логическое НЕ и двойное логическое НЕ

  • Написать 4 выражения с минимум 3-мя операндами, используя следующие операторы: логическое И, логическое ИЛИ, логическое НЕ и двойное логическое НЕ. В части выражений использовать группировки

  • Задать минимум 5 числовых переменных со следующими значениями: целое, дробное, NaN, бесконечность, близкое к максимально безопасному целому. В качестве значения можно использовать выражения

  • Написать несколько выражений с 2 операндами и базовыми операторами: сложение, вычитание, умножение и деление

  • Написать несколько выражений с 3-мя и более операндами и базовыми операторами: сложение, вычитание, умножение и деление

  • Написать минимум пять конвертаций различных строк в число. Примеры: целое, дробное, бесконечность, число в двоичной системе исчисления, строка текста

  • Задать строку 5-ю различными способами: используя одинарные кавычки, двойные кавычки, шаблонные строки “`”, глобальный объект String без и с new

  • Объявить три переменные со значениями null и undefined и без значения. Определить их типы

  • Объявить 2 переменные типа Symbol c одинаковыми описанием

1.2 Функции

В качестве шаблона использовать function-basic.test.js Запуск теста npm run test1.2

  • Создать функцию, используя Объявление функции (Function Declaration)

  • Создать функцию, используя Функциональное выражение (Function expression)

  • Создать функцию суммы, принимающую 2 аргумента

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

  • Создать функцию без аргументов, которая возвращают аргумент в n-й позиции. В качестве n-й позиции использовать первый аргумент функции

  • Создать функцию, которая возвращает строку, в которой каждый аргумент с двух сторон обрамлен “|”

  • Создать функцию, принимающую другую функцию и возвращающую результат вызова переданной функции с префиксом “Result is ”

1.3 Number

В качестве шаблона использовать number.test.js Запуск теста npm run test1.3

  • Написать несколько выражений нахождения остатка от деления
  • Написать функцию нахождения среднего от трех аргументов
  • Написать функцию нахождения последней цифры в числе
  • Написать функцию нахождения суммы цифр в числе
  • Написать функцию определения является ли число простым
  • Написать функцию конвертации строки в число
  • Написать функцию нахождения максимального числа с использованием Math и без
  • Написать функцию нахождения минимального числа с использованием Math и без
  • Написать несколько примеров округления к ближайшему целому с использованием Math и без
  • Написать несколько примеров округления к наименьшему целому с использованием Math и без
  • Конвертировать бинарную запись числа в десятичное представление
  • Конвертировать восьмибитное представление числа в десятичное

1.4 String

В качестве шаблона использовать string.test.js Запуск теста npm run test1.4

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

2 Работа с контекстом

2.1 Замыкание

В качестве шаблона использовать function-n-closure.test.js

  • Создать композицию из 2-х заданных функций
  • Создать пользователя с уникальным идентификатором. Каждый новый идентификатор должен отличаться на 1 от предыдущего
  • Функция при каждом вызове должна возвращать новое значение, увеличенное на заданный шаг, начиная с указанного значения
  • Создание функции внутри цикла. Исправить код так, чтобы были пройдены тесты
  • Найти несколько способов исправления кода
  • Реализация приватного доступа
  • Функция должна создавать функцию умножения на заданный аргумент
  • Подсчитать количество вызовов заданной функции
  • Создать функции мемоизации от одного аргумента. Функция должна кешировать результат вычисления от одного аргумента
  • Логировать начало выполнения функции и завершение выполнения функции
  • Функция должна оборачивать другую функцию. Результат должен вычисляться только при первом вызове функции. При последующих вызовах должен возвращаться результат первого вызова без перерасчетов
  • Каринг. Создать функцию, которая принимает другую функцию F от двух аргументов и возвращает функцию от одного аргумента. Создать еще одну функцию, которая при вызове возвращает фунцию от одного аргумента и при вызове возвращает результат выполнения функции F от двух аргументов

2.2 Изменение и привязка контекста

В качестве шаблона использовать this.test.js

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

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

В качестве шаблона использовать prototype.test.js

  • Функция-конструктор для создания пользователя с именем и сообщением приветствия
  • Функция-конструктор для создания пользователя с именем и сообщением приветствия через прототип
  • Создать ArticleList c двумя методами добавления статьи и получения количества статей с использованием прототипа
  • Создать класс Component c 3-мя методами setData(obj), getData() и render(). setData() должен сливать (merge) существующие данные с переданными. Пример: если текущие данные {name: 'Bob', msg: 'Hello'} то setData({name: 'Tom') то в this.data должно быть {name: 'Tom', msg: 'Hello'} Метод getData() возвращает текущие данные. Метод render() должен вернуть пустую строку Унаследовать от Component UserComponent Переопределить метод render так, чтобы он возвращал строку ${msg}, ${name}!, используя this.data. Eсли name null или undefined - вместо имени использовать guest. Добавить два метода login и logout. Метод login в качестве имени устанавливает переданное значение. Logout вместо имени устанавливает null
  • Создать функцию extend(Child, Parent) для классового наследования Протестировать на классах Component и UserComponent из предыдущего задания
  • Создать классы Component и UserComponent, используя class declaration
  • Создать объект, используя в качестве прототипа другой объект через Object.create

3 Структуры данных

3.1 Object

В качестве шаблона использовать object.test.js

  • Найти значения в объекте по заданному пути
  • Создать новый объект из указанных свойств из заданного объекта
  • Клонирование объекта. Решить задачу несколькими способами
  • Поверхностное сравнение двух объектов
  • Глубокое сравнение двух объектов
  • Исправить функцию проверки доступа

3.2 Array

В качестве шаблона использовать array.test.js

  • Найти позицию первого вхождения заданного элемента в массив
  • Создать массив, два раза повторяющий исходный массив
  • Конвертировать массив чисел в массив строк. Усложненный вариант - конвертировать массив из значений любых типов в массив строк
  • Найти количество вхождений заданного элемента в массив
  • Конвертировать массив строк в массив строк в верхнем регистре
  • Вставить элемент в заданную позицию массива
  • Найти последние n-элементов в массиве
  • Найти 3 самых больших элемента в массиве
  • Отсортировать массив чисел, используя метод Array. Дополнительно написать сортировку пузырьком
  • Найти сумму всех элементов массива чисел
  • Найти все уникальные элементы массива. Решить 2-мя способами. В одном из решений использовать Set
  • Сгруппировать массив объектов по заданному ключу
  • Удалить из массива все ложные значения
  • Сделать массив массивов плоским с глубиной в один уровень
  • Сделать массив массивов плоским рекурсивно
  • Найти пересечения двух массивов
  • Удалить из массива все элементы, не удовлетворяющие заданному условию
  • Создать стек на основе массива
  • Создать очередь на основе массива