• Почему при сравнении результат отличный от троичного условного оператора?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    В выражении -1 ? 1 : 2 значение -1 приводится к типу boolean и получается true
    В выражении -1 == true значение true приводится к числу и получается 1
    https://habr.com/ru/company/ruvds/blog/347866/

    P.S. лучше использовать строгое сравнение (=== и !==) и приводить типы явно
    Ответ написан
  • В чем логика не проверять типы по переменной?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    В TypeScript структурная типизация, а это значит, что типы идентичные по структуре являются одним и тем же типом. Например типы { colour: string; width: number; } и { colour: string; } & { width: number; } являются одним и тем же типом.
    Помимо того в TypeScript присутствует иерархия типов, то есть существуют отношения между типами, когда один тип является подтипом другого. Например тип { colour: string; width: number; } является подтипом { width: number; }. Значение подтипа можно беспроблемно присвоить в переменную родительского типа. Значение типа { colour: string; width: number; } содержит все поля требуемые типом { width: number; }, а значит присваивание первого во второго гарантировано не приведет к ошибке, но результирующий код получит доступ только к части данных. Это поведение вполне удовлетворяет примеру
    let squareOptions = { colour: "red", width: 100 };
    let mySquare = createSquare(squareOptions);

    Однако, когда мы присваиваем литерал, иерархия типов учитывается меньше, так как подтип ограничит нас в получении данных в дальнейшем, а других способов получить эти данные нет. По этому TypeScript и ругается на передачу литерала тутcreateSquare({colour: "red", width: 100});Поле colour будет просто утеряно, так как тип { width: number; } не даст к нему доступ.
    Ответ написан
  • Как остановить цикл map() по условию?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    Остановить итерацию в методе map никак.
    Можно найти индекс нужного элемента с помощью метода findIndex() и обрезать массив относительно него.
    Только стоит учесть, что искомого элемента может не быть в массиве, и тогда findIndex() вернет -1
    const arr = [
      {value: 1},
      {value: 2},
      {value: 3},
      {value: 4, active: true},
      {value: 0},
      {value: 0},
      {value: 0},
      {value: 0},
      {value: 0},
    ]
    
    const activeIndex = arr.findIndex(item => item.active);
    wrapper.innerHTML = (activeIndex === -1 ? arr : arr.slice(0, activeIndex + 3)).map(item => `
      <div class="block ${item.active ? "active" : ""}">
        ${item.value}
      </div>
    `).join("")
    Ответ написан
  • Чем VirtualBox отличается от Sandboxie?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    Мне просто надо проверит несколько программ. Точнее иллюстратор. Он платный, а я скачаю кряк
    Это УК РФ Статья 146 часть 2, а Вы только что рассказали всему интернету, что собрались нарушать закон

    Можете назвать отличия Sandboxie от VirtualBox?
    Sandboxie на сколько знаю - это просто контейнеризация, то есть программы внутри работают по сути с тем же ядром ОС, но с изолированной файловой системой. И работают они на физическом железе, что быстрее, но в случае вируса вполне позволяет использовать уязвимости приводящие к повреждению железа.
    VirtualBox - это полноценная виртуализация, внутри на эмулированном железе работает полноценная ОС, в том числе не только Windows

    Может ли вирус на компе проявиться через неделю???
    Ну например вот

    И как проверить, в песочнице, есть ли вирус.
    Антивирусом. (с)КО
    А может ли антивирус не обнаружить вируса?
    Может

    P.S. иллюстратор сейчас распространяется по подписке, можете купить на месяц, сделать работу, а когда он станет не нужным - просто не продлевать подписку
    Ответ написан
  • Как декодировать данное выражение?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    Звездочка здесь относится к типу, а не к имени, и означает, что это указатель, просто синтаксис C позволяет здесь поставить пробел в любом месте (или не ставить его вовсе)
    По итогу, это функция match, которая принимает 2 аргумента - char и указатель на char, и возвращает так же указатель на char
    Ответ написан
  • Сокращенный импорт для *.tsx и *.jsx, нужно ли добавлять алиасы и в конфиг вебпака и в tsconfig?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    tsconfig.json
    {
        "compilerOptions": {
            "baseUrl": "./",
            "paths": {
                "@*": ["./src/modules/*"]
            }
        }
    }
    остальные параметры по своему вкусу

    с webpack боюсь придется для каждой папки генерировать свой алиас, но учитывая что конфиг webpack - это код, не большая проблема, а за основу для генерации он может брать tsconfig.json
    Ответ написан
  • Как вывести данные переменной из async функции?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    Асинхронная функция всегда возвращает промис, притом на момент, когда она его вернула результата еще нет, он будет потом, в неопределенном будущем.
    Можно получить результат в колбэк метода then:
    get_user_name().then(alert);
    Или получить его через await из другой асинхронной функции:
    (async () => {
      alert(await get_user_name());
    })();
    Ответ написан
  • Как проверить тип параметров ф-ции?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    Типов нет в рантайме, так что нужно проверять по тому что есть, например написать примерно такой тайпгвард:
    const isFormPropsType = (v: FormPropsType | {path: string}): v is FormPropsType => typeof (v as FormPropsType).formName === 'string';

    И соответственно использовать его для проверки:
    const authForms:AuthFormsType = {
      login:(props) =>{
        if(isFormPropsType(props)){
          return <Login 
          formName={props.fromName} 
          onSubmit={props.onSubmit} 
          changeFormStateHandler={props.changeFormStateHandler}
          />
        } 
        return <Login path={props.path} />
      },

    Хотя подозреваю, что можно гораздо проще сделать в данном случае:
    const authForms:AuthFormsType = {
      login:(props) => {
        return <Login {...props} />
      },
    Ответ написан
  • Асинхронность и чистые функции несовместимы?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    Чистота функции определяется двумя условиями:
    1. Функция детерминирована
    2. Функция не имеет побочных эффектов
    Если оба этих условия истинны, то тогда функцию можно считать чистой.

    Детерминированность функции означает, что любому набору входных данных можно однозначно сопоставить результат и этот результат будет всегда таким для данного набора аргументов, независимо ни от чего. То есть умножение, сложение, нахождение максимума - это все детерминированные функции, а вот функции вычисляющие псевдослучайное число, текущую дату или температуру с датчика - нет, так как зависят от внешних изменяющихся условий.

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

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

    Что же качается асинхронности, то большинство асинхронных операций (если не все) порождают побочные эффекты. Но можно выносить их на край приложения, а основную логику строить в виде чистых функций. Покажу на примере такого сценария:
    1. Пользователь кликает на кнопку
    2. Данные из стейта подготавливаются и отправляется запрос на сервер с ними
    3. Когда пришел ответ данные снова преобразуются и обновляется стейт
    let state = {
        // для простоты будем считать что эти данные уже есть
        formData: {
            text1: 'Hello',
            text2: 'world',
            checkbox1: true,
            checkbox2: false
        },
        // а сюда мы должны положить результат запроса
        requestResult: null
    };
    // querySelector не детерминирован, а подписка на событие - побочный эффект
    document.querySelector('.button').addEventListener('click', clickHandler);
    
    // prepareFormData - чистая функция
    function prepareFormData(formData) {
        return {
            text: `${formData.text1} ${formData.text2}`,
            checkboxes: [
                ['checkbox1', formData.checkbox1],
                ['checkbox2', formData.checkbox2]
            ].filter(([, v]) => v).map(([v]) => v)
        };
    }
    
    const API_URL = '/api/data';
    
    // createRequestSender - чистая функция
    // API_URL - константа, она не меняет результат
    // сама createRequestSender не делает запроса к api
    // она просто "вычисляет" из preparedFormData функцию, притом детерминировано
    function createRequestSender(preparedFormData) {
        const body = JSON.stringify(preparedFormData);
        // а вот возвращаемая функция уже грязная:
        // хотя она и вполне детерминирована,
        // но она вызывает fetch и response.json имеющие побочные эффекты
        // но это никак не влияет на чистоту внешней функции createRequestSender, так как та ее не вызывает
        return async () => {
            const response = await fetch(API_URL, {
                method: 'POST',
                body
            });
            const result = await response.json();
            return result;
        };
    }
    
    // mapResponseToState - чистая функция,
    // а вот если бы мы напрямую изменили state вместо копирования его в результат
    // это бы был побочный эффект, так как state не принадлежит mapResponseToState
    function mapResponseToState(state, responseResult) {
        return {
            ...state,
            requestResult: (responseResult.ok
                ? {
                    showSuccess: true,
                    showError: false,
                    text: responseResult.result
                }
                : {
                    showSuccess: false,
                    showError: true,
                    text: responseResult.error
                }
            )
        };
    }
    
    // обработчик клика clickHandler будет тем самым грязным краем
    async function clickHandler() {
        // чистая операция
        const requestSender = createRequestSender(prepareFormData(state.formData));
        // побочный эффект
        const result = await requestSender();
        // еще чистая операция
        const newState = mapResponseToState(state, result);
        // и снова побочный эффект
        state = newState;
    }
    Ответ написан
  • 300 веб сокетов?

    bingo347
    @bingo347 Куратор тега Node.js
    Ткнуть в доку лучше готового к копипасте ответа
    Если операции вычисления блокирующие и блокирует они поток надолго, то стоит вынести их в воркеры, само количество воркеров лучше выбрать по количеству логических ядер (хардварных потоков), а распределять задачи можно простым round robin алгоритмом, если сами задачи примерно одинаковые.
    А насчет сокетов, 300 постоянных коннектов на 1 процесс/поток для ноды сущий пустяк, она спокойно переварит несколько десятков тысяч, если поток не блокировать дольше нескольких десятков операций
    Ответ написан
  • Почему при замене prototype не меняется поведение объектов?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    P.S. я так понимаю в момент создания new User создается ссылка на тот объект, что в User.prototype, при создании нового, а не мутации, ссылки не обновляются, верно ?
    верно
    При создании объекта через new Func ссылка из Func.prototype копируется в новый объект.
    Так же после Вашего хака перестанет работать оператор instanceof, так как он работает на рекурсивном сравнении этих ссылок.
    Ответ написан
  • Есть ли готовая функция для выявления цвета у картинки?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    https://developer.mozilla.org/ru/docs/Web/API/Canv...
    Ну а дальше просто пройтись и посчитать
    Ответ написан
  • Как динамически передавать дженерик тип?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    Если commonName - переменная, то ее тип можно извлечь через typeof
    submitHandlersCreator<AuthFormsDataTypes[typeof commonName]>({
                      dispatch,
                      path: `${location.pathname}${location.search}`,
                      actionName:commonName
                    })
    Но у нее должен быть литеральный тип или юнион литеральных типов, притом из множества ключей AuthFormsDataTypes
    Ответ написан
  • Ошибка при установке npm пакетов?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    1) Для node-gyp нужен python 2 версии
    2) node-gyp не переваривает юникод, избавьтесь от кириллицы в путях
    3) https://gist.github.com/bingo347/e6c8e1fe605ecb26d...
    Ответ написан
  • Prettier и ESLint (в VSC) конфликтуют по поводу пробелов перед скобками - data() - как их подружить?

    bingo347
    @bingo347
    Ткнуть в доку лучше готового к копипасте ответа
    Ну во-первых, настроить eslint правильно: https://eslint.org/docs/rules/space-before-functio...
    В Вашем случае нужен не 'off', а ['error', 'always']
    Во-вторых, настроить остальные правила в eslint согласно принятому код стайлу
    В-третьих, заменить prettier на eslint --fix и выкинуть prettier за не надобностью, ибо eslint из коробки умеет все то же, что и prettier и много чего еще, а с плагинами его возможности вообще безграничны
    Ответ написан
  • Как сделать, чтобы код выполнялся после того, как изменится значение?

    bingo347
    @bingo347 Куратор тега JavaScript
    Ткнуть в доку лучше готового к копипасте ответа
    Можно запоминать последнее значение и сравнивать текущее с запомненным:
    let lastOnlinePlayers
    util.status('test')
      .then((response) => {
        if (response.onlinePlayers === lastOnlinePlayers) return;
        lastOnlinePlayers = response.onlinePlayers
        if (response.onlinePlayers > botOnlineMatch.maxOnline) {
          botOnlineMatch.maxOnline = response.onlinePlayers
        }
        if (response.onlinePlayers > botOnlineMatch.dayOnline) {
          botOnlineMatch.dayOnline = response.onlinePlayers
        }
      })
    Ответ написан