Ответы пользователя по тегу JavaScript
  • Как различить бинарный и унарный операторы когда они используются вместе?

    @Interface
    Если возникает необходимость посмотреть как интерпритируется тот или иной синтаксис - может быть полезно посмотреть на AST. Сделать это можно, например, тут https://astexplorer.net/

    Слева вставляете код, справа смотрите как его понимает парсер (не реальный парсер движка, но в большинстве случаев это не критично)

    Если вы вдруг забыли приоритеты операций (yield vs. ternary например) - это может быть полезно
    Ответ написан
    Комментировать
  • Как записать в локальный JSON?

    @Interface
    у вас есть 4 варианта:
    - хранить в localStorage (это не JSON файл, но может быть вам подойдет) - вероятно самое простое
    - генерировать файл в браузере и предложить пользователю его сохранить (тут можно почитать https://stackoverflow.com/questions/3665115/create...
    - запускать не только браузер на своей машине, но и сервер (ну и обрабатывать запросы и т.д.)
    - использовать совмещенный браузер с нодой (похоже на 3 вариант). Вам может подойти nw.js или electron

    XMLHttpRequest - выполнит только запрос и будет частью решения #3, но само взаимодействие с файловой системой будет делать сервер
    Ответ написан
  • Регулярное выражение на добавление символов?

    @Interface
    Обратите внимаение на алгоритмы поиска разницы (diff) в тесте. Есть, например, такая библиотека https://github.com/kpdecker/jsdiff . В зависимости от того, для чего это вам может быть нужно, может быть полезно.
    Ответ написан
    Комментировать
  • Можно ли считать выполнение xmlhttprequest запроса работой в отдельном потоке?

    @Interface
    Дисклеймер:
    С веб-воркерами (и чем-то подобным) все и так понятно, поэтому далее я пишу вне их использования

    Ответ на ваш вопрос сильно зависит от понимания заголовка. Если мы говорим про браузер или какую-то его часть - то вполне вероятно это действительно работа в отдельном потоке. Только это работа браузера, а не javascript. Вот например статья про node.js https://codeburst.io/how-node-js-single-thread-mec... (достаточно прочитать Top Highlight)
    The main event loop is single-threaded but most of the I/O works run on separate threads, because the I/O APIs in Node.js are asynchronous/non-blocking by design, in order to accommodate the event loop.

    Таким образом про node.js можно сказать, что оно - многопоточное приложение. Но вот с точки зрения javascript-а, то есть как-бы изнутри него - node.js - однопоточный. Иными словами: весь JavaScript код и в браузере и в ноде позиционирует себя как однопоточное приложение. И исполняется так же. Но какие-то операции вне языка (I/O или тот же xhr) могут быть реализованы как угодно браузером. Это строго говоря вопрос больше про устройство среды исполнения.

    Я подвис, но мой ответ был, что JS можно считать многопоточным и я так предполагаю из-за наличия xmlhttprequest запросов (в простонародии ajax).
    - строго говоря это не так. Хотя мне кажется это не далеко от истины. Если мы поговорим, что язык многопоточный, я думаю мы имеем ввиду, что языком поддерживается работа с потоками, а не то как он устроен изнутри или как изнутри устроена среда его исполнения. Потому как какая-нибудь сборка мусора может выполняться в отдельном потоке, но это не делает сам ЯЗЫК много поточным.

    Вопрос: Относится ли WebAPI к движку JavaScript и корректно ли утверждать, что фактически xmlhttprequest выполняется в отдельном потоке от остального кода JavaScript?

    - Нет. Это API которое браузер предоставляет внутрь движка. Это можно проследить взяв например node.js и сравнив с браузерным js. Так, например, в node.js доступны внутренние модули (fs, http, path etc.)., а также другие фичи, такие как process.argv и так далее, в то время как в браузере есть WebAPI, например, fetch. При этом в браузере нет require('path'), зато в ноде нет fetch.

    И это при том что и браузер (chrome) и node.js работают на одном движке (V8).

    В node.js нет доступа к xhr, что уже может навести на мысли о том, что это не часть движка.

    Важное замечание: я думаю сравнивая node.js и браузер, можно сформировать какое-то представление о том, что из себя представляет чистый движок js, но тем не менее это не полностью достоверно. Потому как, например, и там и там есть совместимые друг с другом setInterval и setTimeout, однако (если мне не изменяет память) они не входят в движок.

    Если хочется четче понять где проходит граница, но не так сильно чтобы читать спеки - можно попробовать встроить движок самостоятельно. V8 или SpiderMonkey (в Firefox'е) умеют встраиваться в другие приложения и если встраивать их самостоятельно - и API внутрь движка (причем конкретной его реализации, а не абстрактного понятия) нужно будет прокидывать самостоятельно - тогда можно будет увидеть, что в голом движке не будет ни setTimeout, ни alert, ни console.log, ни document ни даже require и т.д.
    Ответ написан
    1 комментарий
  • Как менять цвет элемента в зависимости от цвета элемента ниже него?

    @Interface
    Как вариант: сделать большой круг, разделенный на разноцветные сектора, а кольцо вокруг и курсор сделать прозрачными. (Но это не совсем то)

    Не думаю что смотреть на цвет правильный путь. Возможно лучше расчитывать цвет курсора в зависимости от положения колеса. Например как функцию от угла поворота и в зависимости от этого менять цвета.

    То есть моя главная мысль: не нужно расчитывать участки кольца, раскраышивать их и потом смотреть на полученный цвет и таким же красить куросор - это ресурсоемко.

    Лучше расчитывать и цвета секторов и цвета курсора от чего то другого.
    Ответ написан
    1 комментарий
  • Как заполнить массив в node.js?

    @Interface
    Судя по всему у вас смешаны промисы и библиотека async https://www.npmjs.com/package/async .
    Согласен с shmatuan, что лучше всего было бы использвовать async/await. Если это невозможно советую переписать на что-то одно, либо callback'и, либо Promis'ы (лучше второе конечно).

    Судя по коду проблема в том что колбэк в котором пополняется массив ассинхронный. Это значит что из внешней функции мы выйдем до его исполнения. А значит слудующий колбэк в async.series выполнится с пустым массивом.

    Иван Жильников Вот это один из вариантов решения проблемы:
    https://jsfiddle.net/int0h/17bojhfm/

    То есть использование Promise.all

    В конце есть решение на async / await, оно делает примерно то же что и ваше, но читается намного лучше и занимает 10 строк, а не 30. Спойлер, вот оно:
    async function main() {
        const scales = await DB.GetAllScales();
        const result = await Promise.all(
            scales.map(async scale => ({
                TypeScales: await DB.GetTypeScales(scale.Name),
                NameScales: scale.Name
            }))
        );
      console.log('async / await result:', result);
    }
    Ответ написан
    Комментировать
  • Как написать функцию, которая изменяет текст во всех областях?

    @Interface
    Ну если у вас работает и устраивает все что вы написали, то логичным продолжением будет написать функцию, которая делает из строки "mixcase".

    Она может выглядеть так например:
    function toMixCase(str) {
    	return str
            .split('')
            .map(char => Math.random() > 0.5 ? char.toLowerCase() : char.toUpperCase())
            .join('');
    }


    (Лучше конечно написать свою реализацию)

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

    @Interface
    phoneString = '+7-(777)-77-77-777';
    phoneString.replace(/\D/g, '');
    Ответ написан
    1 комментарий
  • Как написать асинхронную функцию на чистом JS для мобильного браузера Chrome?

    @Interface
    Транспилируйте ваш код: babel, typescript

    Или не поддерживайте браузеры не поддерживающие нужные вам синтаксические фичи. Не вижу других адекватных вариантов.
    Ответ написан
    Комментировать
  • Как сложить определенные свойства объектов?

    @Interface
    const a = {point: 1};
    const b = {point: 2};
    const c = {point: 3};
    
    const arr = [a, b, c];
    
    arr.reduce((sum, item) => sum + item.point, 0); // 6


    Ну или так:
    const a = {point: 1};
    const b = {point: 2};
    const c = {point: 3};
    
    const arr = [a, b, c];
    
    arr
        .map(item => item.point)
        .reduce((sum, value) => sum + value); // 6


    Или если в проекте уже есть lodash:
    const a = {point: 1};
    const b = {point: 2};
    const c = {point: 3};
    
    const arr = [a, b, c];
    
    _.sumBy(arr, item => item.point);
    Ответ написан
    Комментировать
  • Как в одну страничку вставить другую?

    @Interface
    Если я все правильно понял (код не смотрел), вы можете вставить верстку, но скрипты не отрабатывают. Такое бывает при вставке через innerHTML, например. Это можно довольно просто решить вручную выполнив скрипты через eval. Почитайте тут: https://stackoverflow.com/questions/1197575/can-sc...
    Ответ написан
    6 комментариев
  • Как написать программу для сайта?

    @Interface
    Думаю проще оставить веб-версию и использовать, например, https://github.com/GoogleChrome/puppeteer
    Или https://www.seleniumhq.org/
    Ответ написан
    Комментировать
  • Как правильно писать код под node js?

    @Interface
    Чтобы не делать "огромную логику в ветке else коллбэка" можно использовать early-return https://forum.freecodecamp.org/t/the-return-early-...

    Чтобы не делать большую вложенность и callback-hell нужно проделать путь: callback -> promise -> async/await

    Ваш код станет примерно таким
    async function foo() {
        try {
            const content = await fs.readFile("config.json", "utf-8");
            const obj = JSON.parse(content);
            console.log(obj);
        } catch(error) {
            console.error(error);
        };
    }


    При этом функция останется ассинхронной и не будет блокировать поток.
    Ответ написан
    2 комментария
  • Javascript-фреймворки/движки для создания сайта, работающего в браузере клиента?

    @Interface
    По сути все что вам нужно - это написать SPA (как уже писали выше), потому что у вас не может быть серверной шаблонизации. Для этого можно использовать любой инстурмент по душе.

    При этом ваше приложение (SPA) будет ходить в API стороннего сервиса (который должен это поддержать).

    Короче говоря, вам нужен самый обычный SPA, только у него будет особенность в том, что сервер отдающий статику и сервер API будут разные. Что не вызовит у вас проблем, если сервер API это поддержит. Если у вас возникают вопросы - скорее всего они либо про написание SPA, либо про AJAX & CORS etc. Но это уже не какая-то уникальная проблема и это все гуглится
    Ответ написан
    Комментировать
  • Как просмотреть скомпилированный код из jQuery в чистый js?

    @Interface
    Выше верно подметили, что компиляция тут не причем.

    Думаю, будет полезно: youmightnotneedjquery.com
    Ответ написан
    Комментировать
  • Как из объекта сделать массив?

    @Interface
    Проблема в том, что объект первого вида - тоже "нормальный" объект.

    Если в первом случае все ключи должны быть строковыми записями чисел, то можно так, например:
    function normalizeObject(obj) {
        if (Object.keys(obj).every(key => Number(key).toString() === key)) {
            return Object.assign([], obj);
        }
        return obj;
    }
    Ответ написан
    Комментировать
  • Что быстрее импортится локальный модуль или глобальный?

    @Interface
    Нужно импортить в тех модулях, где оно нужно. Модули в node.js кешируются https://nodejs.org/api/modules.html#modules_caching
    Ответ написан
    2 комментария
  • Как с помощью js окрасить область, замкнутую внутри контура path в SVG?

    @Interface
    Выложите код или демо с воспроизведением проблемы - так будет проще. Вероятно вам поможет атрибут fill как писали выше плюс fill-rule https://www.sitepoint.com/understanding-svg-fill-r...
    Ответ написан
    Комментировать