Задать вопрос
Ответы пользователя по тегу JavaScript
  • Тратит ли функция cb = ( e ) => e ресурсы на вычисления?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В общем случае да - как минимум на создания контекста вызова, но после оптимизации может и не тратить, identity функция (функция просто возвращающая свой аргумент, как Ваш cb) хорошо инлайнится, тут вопрос в том - инлайнится ли функция, в которую Вы ее передаете.

    Для понимания, нужно понимать, что v8 делает с кодом под капотом:
    Когда платформа (браузер, node.js) только загрузила исходный код в v8, то выполняет его с помощью интерпретатора Ignition, а заодно анализирует это выполнение. На этом этапе весь код выполняется как есть.
    Функции которые вызвались 2-3 раза отправляются в оптимизирующий JIT компилятор TurboFan, который скомпилирует из JS машинный код и сделает множество оптимизаций. В частности он может инлайнить некоторые функции (но не все).
    Например, если при анализе кода выяснится, что некая функция f0 постоянно вызывает f1 передавая ей Ваш cb, и при этом f1 чистая функция - то f1 скорее всего заинлайнится в f0, а вызов cb просто заменится на свой аргумент. Но опять же, все зависит от Вашего кода и на сколько он оптимизируемый.

    В любом случае identity функция очень легкая
    Ответ написан
    4 комментария
  • Как контролировать количество табов в puppeteer?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const PARES_CONCURENCY = 10; // сколько вкладок открываем за раз
    runURLs([
      'https://site.com/url1',
      'https://site.com/url2',
      'https://site.com/url3',
      'https://site.com/url4'
      // ...
    ]).then(() => console.log('Готово!'));
    
    async function runURLs(urls) {
      const browser = await puppeteer.launch();
      const tasks = urls.map(url => async () => {
        const page = await browser.newPage();
        await page.goto(url);
        // делаем что-то со страницей
        await page.close();
      });
      const queue = tasks.slice(PARES_CONCURENCY)[Symbol.iterator]();
      const runNextTask = () => {
        const {value, done} = queue.next();
        if(done) { return; }
        return value().then(runNextTask);
      };
      await Promise.all(tasks.slice(0, PARES_CONCURENCY).map(task => task().then(runNextTask)));
      await browser.close();
    }
    Ответ написан
    Комментировать
  • Как прослушать звуковой файл, получить текст и сравнить его с предоставленным текстом и нажать на определённую кнопку на JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    2. https://cloud.yandex.ru/services/speechkit
    3. точно не распознает, поэтому гуглим расстояние Левинштейна
    насчет нажать кнопку - не проще функцию вызвать напрямую?
    Ответ написан
    3 комментария
  • Как повысить requestAnimationFrame?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В колбэк requestAnimationFrame первым аргументом приходит время в миллисекундах с дробной частью (как в результате performance.now)
    меряйте сколько прошло времени после последней анимации, если меньше некоего порогового значения (подберите) - то просто планируем следующий requestAnimationFrame и ничего не рисуем
    Ответ написан
    Комментировать
  • С чего правильно начинать изучение JavaScript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    learn.javascript.ru - конечно отвратительный учебник, написанный хорошим методистом, но отвратительным программистом. Научится, то Вы по нему научитесь, но плохим практикам...
    Флэнаган - с точностью до наоборот, книга от хорошего программиста, но вот с методологией обучения... вообщем научится будет сложно, но если научитесь, то научитесь правильным вещам

    ну и соглашусь с комментарием Brad9aga под вопросом, нужно сначала азы изучить, как вообще компьютер работает, как процессор считает, как память хранит данные, и лишь после браться за какой либо язык программирования
    Ответ написан
    5 комментариев
  • Используют ли document.write и почему бы нет?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    document.write сейчас реально используется только в одном случае - для динамического формирования документа внутри iframe, хотя и тут он постепенно вытесняется srcdoc атрибутом
    Ответ написан
    Комментировать
  • Как сделать так, чтобы scrollTop срабатывала при перезагрузке страницы, когда страница уже проскролена вниз?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function onScroll() {
        var windowTop = $(window).scrollTop();
        windowTop > 28 ? $('nav').addClass('stick-nav') : $('nav').removeClass('stick-nav');
    }
    $(window).scroll(onScroll);
    $(onScroll); // или просто onScroll();
    Ответ написан
    1 комментарий
  • JavaScript (рекурсия) Как из одного массива (каталог) сделать другой (дерево)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function parsePath(path) {
      return path.split(',').reduce((acc, item) => {
        const [key, value] = item.split('=');
        switch(key) {
        case 'name':
          acc.name = value;
          break;
        case 'f':
        case 'g':
          acc[key].push(value);
          break;
        }
        return acc;
      }, {
        name: '',
        f: [],
        g: []
      });
    }
    
    function normalizeTree(tree) {
      return Object.keys(tree).map(label => {
        const item = tree[label];
        if(item.id) { return item; }
        const children = normalizeTree(item);
        const id = `[${children.map(({id}) => id).join(',')}]`;
        return {id, label, children};
      });
    }
    
    function reduceToTree(data) {
      return normalizeTree(data.reduce((acc, {path, id}) => {
        const {name, f, g} = parsePath(path);
        const target = f.reverse().concat(name).reduce((target, label) => {
          return target[label] || (target[label] = {});
        }, acc);
        target.id = id;
        target.label = name;
        target.g = g;
        return acc;
      }, {}));
    }
    
    console.log(reduceToTree([
      {
        "path": "name=Tel6,g=tovarov,g=catalog",
        "id": "6000",
        "name": "Tel6"
      },
      {
        "path": "name=Tel1,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "1000",
        "name": "Tel1"
      },
      {
        "path": "name=Tel2,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "2000",
        "name": "Tel2"
      },
      {
        "path": "name=Tel3,f=Galaxy,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "3000",
        "name": "Tel3"
      },
      {
        "path": "name=Tel4,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "4000",
        "name": "Tel4"
      },
      {
        "path": "name=Tel5,f=A,f=Samsung,g=tovarov,g=catalog", // f= неограниченная вложенность
        "id": "5000",
        "name": "Tel5"
      }
      // ...
    ]));
    Ответ написан
  • Как отправить форму?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Метод getElementsByTagName возвращает не один элемент, а коллекцию, у которой нет метода submit

    Возможные решения:
    1. Выбрать конкретный элемент из коллекции по индексу: form = popup.getElementsByTagName('form')[0]
    2. Выбрать конкретный элемент по селектору: form = popup.querySelector('form')
    3. Выбрать элемент по id: form = document.getElementById('wpua-edit-13')
    Ответ написан
    Комментировать
  • Как получить кол-во миллисекунд до завтрашнего дня?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function getMSBeforeMidnight() {
      const d = new Date();
      const currentTimestamp = d.getTime();
      d.setDate(d.getDate() + 1);
      d.setHours(0);
      d.setMinutes(0);
      d.setSeconds(0);
      d.setMilliseconds(0);
      return d.getTime() - currentTimestamp;
    }
    Ответ написан
    3 комментария
  • Если true выводит false а если false выводит true замыкание, что не так?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Давайте разберем все по строчкам, что Вы тут понаписали:
    function toggleMe() {
      // я кажется начинаю понимать ОТ кого придумали typescript...
      var a = 0; // если логика подразумевает логический тип, зачем init-значение число?
      return function() {
        if(a = true) { // это условие всегда будет истинно, независимо от a, в a сохраним значение true
          a = false;
        } else if (a = false) { // в принципе тоже что и выше, но еще этот код не достижим
          a = true;
        }
        return a;
      }
    }
    var a = toggleMe(); // в a извлекли функцию с замыканием
    var b = a(); // в b будет false
    console.log(b);
    console.log(b); // а второй лог что-то меняет? нет

    Теперь давайте посмотрим, что произойдет, когда данный код попадет в современный движок JS:
    1.
    function toggleMe() {
      var a = 0;
      return function() {
        if(a = true) {
          a = false;
        } else a = false /* удаляем недостижимый код if (a = false) {
          a = true;
        } */
        return a;
      }
    }

    2.
    function toggleMe() {
      var a = 0;
      return function() {
        a = true
        a = false;
    /* этот if разворачивается однозначно
        if(a = true) {
          a = false;
        } else a = false */
        return a;
      }
    }

    3.
    function toggleMe() {
      var a = 0;
      return function() {
        return false;
    /* незачем это вычислять каждый раз, все и так однозначно
        a = true
        a = false;
        return a; */
      }
    }

    4.
    // если вызвать этот код несколько раз:
    var a = toggleMe();
    var b = a();
    console.log(b);
    console.log(b);
    
    // то оптимизатор в конце концов сократит его до
    console.log(false);
    console.log(false);
    // а функцию выкинет совсем


    P.S. возможно имелось в виду это:
    function toggleMe() {
      var a = false;
      return function() {
        return a = !a;
      };
    }
    
    var b = toggleMe();
    console.log(b());
    console.log(b());
    Ответ написан
    3 комментария
  • Как собрать json?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если интересен вариант с меньшими затратами по памяти и CPU чем у Александр
    const items = Array.from(
      document.getElementsByClassName('cartitem'),
      ({textContent}) => ({name: textContent})
    );
    const itemsJSON = JSON.stringify(items);
    Ответ написан
    Комментировать
  • Нормально ли постоянно создавать и убивать воркеры?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Все относительно.
    С одной стороны, запуск нового воркера довольно затратная операция. Браузер поднимает реальный поток ОС, поднимает в нем новый контекст движка JS, настраивает примитивы синхронизации памяти (у JS то память разделена и общение через postMessage, а у браузера на C++ память вполне себе общая, да еще и с конкурентным доступом).
    С другой, что такое ~100мс на старт воркера по сравнению с несколькими минутами решаемой им задачей?

    По итогу:
    Запускать по воркеру на каждую задачу будет работать медленнее, но реализовать проще.
    Иметь пул заранее запущенных воркеров - гораздо быстрее, но придется реализовать этот самый пул, а так же очередь задач и распределение их по пулу.
    Что больше подходит в Вашей ситуации можно сказать лишь точно зная Ваши тех.требования
    Ответ написан
    Комментировать
  • Перебрать массив?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    без учета приоритетов примерно так:
    var arr = [12, '+', 13, '/', 5, '-', 6];
    var result = 0;
    var op = '';
    for(var i = 0; i < arr.length; i++) {
      switch(typeof arr[i]) {
      case 'string':
        op = arr[i];
        break;
      case 'number':
        switch(op) {
        case '+':
          result += arr[i];
          break;
        case '-':
          result -= arr[i];
          break;
        case '*':
          result *= arr[i];
          break;
        case '/':
          result /= arr[i];
          break;
        default:
          result = arr[i];
          break;
        }
        break;
      }
    }
    console.log(result);

    если приоритеты нужны, то нужно в дерево сворачивать
    Ответ написан
    Комментировать
  • Codewars задача, javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    ['Just th'+'row like this!',m=>new this['Er'+'ror'](m),'th'+'row',function*(){},function(){this[3]()[this[2]](this[1](this[0]))}][4]()
    Ответ написан
    Комментировать
  • Как правильно производить манипуляции с датой?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Месяца в JS считаются с 0
    (date.getMonth()) меняем на (date.getMonth() + 1)
    и будет все ок
    Ответ написан
  • Как сделать такой вызов функций?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function Calc() {
        let v = 0;
        const proto = {
            add(x) { v += x; },
            subtract(x) { v -= x; },
            divide(x) { x && (v /= x); },
            multiply(x) { v *= x; }
        };
        const keys = Object.keys(proto);
        const ctx = keys.reduce((acc, key) => {
            const wrap = x => ((!isNaN(x) && proto[key](Number(x))), wrap);
            return ((acc[key] = wrap), acc);
        }, {
            getResult: () => v,
            reset: () => ((v = 0), ctx)
        });
        keys.forEach(key => Object.assign(ctx[key], ctx));
        return ctx;
    }
    Ответ написан
    Комментировать
  • Как в js находить страницу и запускать функцию при заходе на url, которого нет, но он есть, когда мы его создаем через history.push?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Настроить nginx - nginx.org/ru/docs/http/ngx_http_core_module.html#t...
    2. В js при запуске запускать обработчик смены URL руками
    Ответ написан
    Комментировать
  • Как написать асинхронную рекурсивную функцию?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function recursiveRequest(requestData) {
      return fetch(
        //здесь формируем запрос из requestData
      ).then(response => response.json()).then(result => {
        if(result.isFinal) return result; // тут условие
        return recursiveRequest(result.nextRequest); //вызываем следующий запрос
      });
    }
    
    recursiveRequest({}).then(finalResult => {
      //работаем с последним результатом
    });
    Ответ написан
    Комментировать