• Что лучше canvas или svg?

    @Sashjkeee Куратор тега CSS
    f-e
    Плюсы Canvas:
    • Высокая производительность при отрисовке любых 2D объектов.
    • Стабильная производительность — всё есть пиксель. Производительность падает только при увеличении разрешения изображения.
    • Лучше всего подходит для создания растровой графики (например, в играх, фракталов и т.п.), редактирования изображений и операций, требующих манипулирования на уровне пикселей.
    Плюсы SVG:
    • Нет зависимости от разрешения — SVG лучше подходит для кроссплатформенных пользовательских интерфейсов, так как позволяет масштабировать изображение при различных разрешениях экрана.
    • SVG очень хорошо поддерживает анимацию. Элементы могут быть анимированы с использованием описательного синтаксиса или с помощью JavaScript.
    • Можно получить полный контроль над каждым элементом, используя SVG DOM API в JavaScript.
    • SVG хранится в формате XML, что предоставляет больше возможностей браузерам по обеспечению доступности SVG документов по сравнению с элементом canvas. Таким образом, SVG выглядит лучшим решением для пользовательских интерфейсов веб-приложений.
    Минусы Canvas
    • Отрисовка основана на пикселях.
    • Не существует API для анимации. Вам придется прибегать к использованию таймеров и других событий для обновления канвы.
    • Слабые возможности по рендерингу текста.
    • Возможно, не самый лучший выбор, когда доступность имеет решающее значение. Канва предоставляет вам поверхность для рисования в выбранном контексте (2D и 3D). Можно указать альтернативный контент внутри элемента canvas, который будет показан браузером при невозможности отображения графики. Кроме того, вы можете выполнить проверку доступности выбранного Canvas API с помощью JavaScript. На основе этого вы можете обеспечить различную функциональность для пользователей браузеров с разной поддержкой HTML 5 Canvas.
    • HTML 5 Canvas не подходит для создания веб-сайтов или интерфейсов веб-приложений, так как пользовательские интерфейсы обычно должны быть динамическими и интерактивными, а Canvas требует от вас постоянной перерисовки каждого элемента в интерфейсе.
    Минусы svg
    • Низкая скорость рендеринга при увеличении сложности документа (рисунка), так как используется модель DOM
    • Скорее всего, SVG не подходит для таких приложений как игры. Возможно лучшим выбором будет комбинация HTML Canvas + SVG.
    Вывод
    HTML 5 Canvas следует использовать для:
    1. Редактирования изображений: обрезки, изменения размеров, фильтров (удаления эффекта красных глаз, создания эффекта сепии, изменения цветности или яркости)
    2. Создания растровой графики: визуализации данных, создания фракталов и графиков функций.
    3. Анализа изображений: создания гистограмм и т.п.
    4. Создания игровой графики, такой как спрайты и фоны.
    SVG следует использовать для:
    1. Создания пользовательских интерфейсов веб-приложений, независимых от разрешения экрана.
    2. Высокоинтерактивных анимированных пользовательских интерфейсов.
    3. Графиков и диаграмм.
    4. Редактирования векторных изображений.
    честно скопипастил
    Ответ написан
    Комментировать
  • Числа Фибоначчи в JS(рекурсия). Как работает функция?

    dadster
    @dadster
    учить инглиш тут - https://t.me/langhacks
    Оно развертывается дальше до конца (функция рекурсивно вызывает себя), пока не получится что-то вернуть. (т.е. пока не выполнится условие n <= 1, и будет возврат n.

    Для упрощения посмотрим f(5)

    f(5) = f(4) + f(3) -> развертываем дальше вызовы функций с новыми параметрами, получается:
    ( f(3) + f(2) ) + ( f(2) + f(1) ) -> здесь для f(1) уже появляется значение (1), Но для показательности развернем все до конца:
    ( ( f(2) + f(1) ) + ( ( f(1) + f(0) ) + ( ( f(1) + f(0) ) + f(1), здесь уже остается только 1 вызов, для f(2), все остальные возвращают конкретные цифры, f(1) = 1, f(0) = 0. f(2) = f(1) + f(0) = 1.
    Получается 1 + 1 + 1 + 0 + 1 + 0 + 1 = 5.

    Такую же развертку можно сделать и для f(10), все оно тоже сведется к множеству единиц, которые сложатся в 55.

    Надеюсь, вопрос состоял именно в этом, а не в механизме работы рекурсии в JS, если так, то тут я ничего не подскажу)
    Ответ написан
    Комментировать
  • Как реализовать функционал работы с книгами в библиотеке через прототипы?

    @syrexsoez
    Перепиши returnBook вот так:
    Book.prototype.returnBook = function () {
      if (!this.reader) {
        return false
      } else {
        this.reader = null
        return true
      }
    }
    Ответ написан
    1 комментарий
  • Как реализовать функцию,принимающую неограниченное кол-во объектов и возвращает новый объект,содержащий все поля со всех объектов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    раз хочется именно с reduce() – то можно редьюсить массив аргументов до одного результирующего объекта:
    const mergeObjects = (...args) => args.reduce((acc, c) => Object.assign(acc, c));

    Использование:
    mergeObjects({a: 'A'}, {b: 'B'}, {c: 'C', a: 'AAA'})
    // { a: "AAA", b: "B", c: "C" }


    Или так, чуть почище, чтобы не менять первый исходный объект:
    const mergeObjects = (...args) => args.reduce((acc, c) => ({...acc, ...c}), {});
    Ответ написан
    7 комментариев
  • Как раскрыть блок по кнопке через JS?

    @bio_bot
    Эсли я правильно понял код, то по моему ошибка в том что не задана изначальная высота у блока section__brands. Вы добавляете disclosed значение высоты авто, хотя по сути ваш класс уже имеет по умолчанию такое значение.
    Попробуйте section__brands задать какую-то минимальную высоту
    Ответ написан
    Комментировать
  • Реализоват функцию, которая принимает первым параметром объект, вторым - массив из цепочки свойств, по которому нужно пройти, чтобы получить значение?

    @alexalexes
    Зачем создавать отдельную переменную result и присваивать ей obj

    Разработчик этой функции перестраховался, присвоив объект obj локальной переменной функции result, потому что знает, что из контекста функции можно изменять obj во внешнем контексте, если изменять свойства объекта внутри функции, и далее по тексту запланирована некая рекурсия. Однако, переприсваивание самого obj не повлияет на внешний контекст, в этом случае можно не создавать отдельную переменную result (если ничего не делать со свойствами объекта).
    сразу в блоке условия let result = result[chain[i]]

    Ну, мысленно или явно оттрасируйте этот момент:
    // не объявили result, считай он такой
    // result  = undefined
    for (let i = 0; i < chain.length; i++) {
        if (result) { // undefined интерпретируется как false
         let result = result[chain[i]] // сюда вообще не попадаем
        } else {
          result = undefined // сюда попадаем при каждом i, причем result идет во внешний контекст
        }
      }
    Ответ написан
    Комментировать
  • Как создать функцию, которая принимает строку из открывающихся и закрывающихся круглых скобок, и проверяет является ли эта строка корректной?

    @Poliklot
    Строчка let i = 0;
    находится в цикле и поэтому в каждой итерации i равняется нулю => это не отрабатывает как счётчик

    Нужно вынести инициализацию переменной i за цикл
    Пример:
    …
    let i = 0
    for (let char in str) {
    …


    Также и результат нужно узнавать вне цикла)
    Ответ написан
    2 комментария
  • Как создать функцию, которая принимает текст, разделённый переносами строк и возвращает новый текст, в котором каждая строка обернута в тег?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Разбить такой текст по символу новой строки в массив.
    Каждую строку обернуть в тег.
    Снова склеить строки в одну, с помощью символа новой строки:
    text.split('\n')
      .map(row => `<p>${row}</p>`)
      .join('\n');
    Ответ написан
    Комментировать
  • Почему не работает сепаратор через псевдоэлемент?

    @ehoboli
    для этого используется display: inline-block;

    .header__item:nth-last-child(2)::before {
        content: "";
        display: inline-block;
        width: 2px;
        height: 40px;
        margin-right: 16px;
        background-color: #000;
        border-radius: 1px;
    }
    Ответ написан
    1 комментарий