Задать вопрос
  • Как определить, является ли число степенью двойки на javascript с помощью цикла while?

    Alexandroppolus
    @Alexandroppolus
    кодир
    для чисел до 2^31 можно и без цикла

    const isPower2 = n => (n & (n-1)) === 0

    вариант для длинной арифметики
    const isPower2b = n => (n & (n - 1n)) === 0n;
    
    alert(isPower2b(147573952589676412928n));
    Ответ написан
    Комментировать
  • Как правильно передавать пропсы в React-компонент используя TypeScript?

    KataevAS
    @KataevAS
    Предпочтительнее первый вариант.
    Почему: https://github.com/facebook/create-react-app/pull/8177
    Ответ написан
    Комментировать
  • Как понять что ты развиваешься и как найти знакомых?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Самый верный способ - устроиться на работу.
    Ответ написан
    5 комментариев
  • Как в JavaScript контролировать удаление объекта garbage collector-ом?

    Никак.
    Все что может быть собрано, будет собрано. Если у вас утечки, нужно искать источник.
    Ответ написан
    2 комментария
  • Что означает данное ниже определение в Typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Тип Record - это утилити тип из стандартной библиотеки TS, который описывает объект, у которого ключи - первый аргумент дженерика, а значения - второй.
    Тип string[] | Record<string, any>[] - это или массив строк или массив объектов (ключ - любая строка, значение любого типа). Данный тип не позволит смешивать строки и объекты в одном массиве, либо то либо другое.
    Как верно подметил WbICHA в комментарии к вопросу, для приведенных данных корректный тип - это (string | Record<string, any>)[] (массив из строк или объектов в перемешку).

    Ну и вместо any лучше использовать unknown, any - это тип без проверки типов, unknown - это тип который включает в себя все другие типы, в него как и в any тоже можно записать значение любого типа, но в отличии от any при использовании unknown нужно делать либо явное приведение типов, либо рантайм проверки типов.
    Ответ написан
    5 комментариев
  • Почему за просмотр резюме HR необходимо платить деньги, а на биржах фриланса наоборот?

    @spaceatmoon
    На бирже покупателем является исполнитель, а на сайтах по поиску работы является работодатель.

    Биржа не занимается поиском исполнителей. Это такие услуги по рекламе на максималках с кабальными условиями. Кто будет исполнителем вообще не важно, его личность должна быть скрыта, ведь только хозяин должен видеть его паспорт. Исполнители хозяина должны слушаться и говорить с гостем Биржи должны так, как говорит хозяин и держать голову ниц. За лишние слова хозяин наказывает, вплоть до выгона на мороз без права вернуться. При выполнении поручения от гостя исполнитель обязуется платить дань на доход. В некоторых биржах есть ещё оброк раз в месяц. Каждый хозяин ведёт учёт лучших исполнителей. Прикол в том, что эти звёздочки ничего не дают при выходе из этой биржи. Совершив Юрьев день, исполнителю придётся начинать всё сначала, ибо звать вас никак. Ведь внутри любой биржи, личности вашей нет.

    На сайтах по поиску работы всё наоборот. Каждый исполнитель это свободный человек, а у свободных людей есть права и имущество. Они уже стоят каких-то денег. В данном случае имущество это опыт работы в реальном мире. Допустим если ты работаешь погонщиком на бирже это одно, то ты белый человек а если исполнителем на бирже, это пустое, словно чпок от пробки при открытии шампанского.

    Свободные люди не зависят от работодателей и соответственно их внимание привлечь сложнее. Чтобы привлечь внимание такого человека, необходимо немного поделиться золотом. У кого больше золота, тот имеет больший выбор и может выбрать себе подходящего кандидата.
    Ответ написан
    1 комментарий
  • Как заменяються значения переменных с помощью деструктуризации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно по тому же, что и в первый раз.
    Ответ написан
    Комментировать
  • Как отсортировать массив, имеющий текст с числами в JS?

    @GrayHorse
    const {compare} = new Intl.Collator(undefined, {
        numeric: true
    });
    const array = ["x32-Sar", "x2-Far", "x1-Tar", "x11-Har"];
    array.sort(compare); // ["x1-Tar", "x2-Far", "x11-Har", "x32-Sar"]
    Ответ написан
    Комментировать
  • Как правильно обрезать строку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно регулярным выражением вытащить последнее число прямо перед закрывающей скобкой, которое непременно со знаком минус:
    const str = 'matrix(1, 0, 0, 1, 0, -47)'
    
    +str.match(/(-\d+)\)/).pop()  // -47
    Плюс перед выражением это унарный оператор, который переводит аргумент в тип число.
    Ответ написан
    5 комментариев
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Задача проверки последовательности на палиндром решается за O(n/2). Но для этого нужно иметь последовательный доступ к обоим концам последовательности за O(1).
    Если такой возможности нет и имеется доступ только к одному из концов последовательности, то придется обойти всю последовательность, а это уже O(n). Один из таких, достаточно оптимальных алгоритмов для цифр целого числа уже представил WbICHA.

    Чтоб решить эту задачу за O(n/2) нужно понять, как получить крайние цифры числа за O(1).
    Крайнюю справа цифру можно получить простым остатком от деления на основание системы счисления, то есть, в случае десятичной системы счисления, на 10.
    Для получения крайней справа цифры нужно знать ее порядок (считая справа начиная с 0). Это можно сделать взяв целую часть от логарифма по основанию системы счисления (10). На JS такая операция будет выглядеть так:
    Math.trunc(Math.log10(num))
    Целая часть от деления числа на 10 в степени порядка правой цифры даст саму эту цифру. На JS это выражается так:
    Math.trunc(num / 10 ** Math.trunc(Math.log10(num)))

    Так же алгоритм требует равномерного перемещения по последовательности от краев к центру.
    Для правой цифры опять все просто, можно брать целую часть от деления числа на основание (10).
    Для левой нужно умножить ее на основание в степени порядка и вычесть результат из самого числа, то есть:
    num - leftDigit * 10 ** Math.trunc(Math.log10(num))


    Осталось учесть пограничные условия:
    1. Если крайний левый и крайний правый элемент не равны, то последовательность не является палиндромом
    2. Последовательность из одного элемента (число из одной цифры) всегда палиндром.
    3. При равенстве крайних элементов последовательность будет палиндромом если палиндромом так же является подпоследовательность без этих элементов.

    Пункт 3 подразумевает рекурсию, но такая рекурсия легко разворачивается в цикл, что конечно же более оптимально.

    По итогу получим такую функцию:
    const isPalindrome = num => {
        let n = num;
        while (n >= 10) {
            const order = 10 ** Math.trunc(Math.log10(n));
            const leftDigit = Math.trunc(n / order);
            const rightDigit = n % 10;
            if (leftDigit !== rightDigit) return false;
            n -= leftDigit * order;
            n /= 10;
            n = Math.trunc(n);
        }
        return true;
    };


    P.S. варианты с приведением числа к строке, а тем более с последующим разбиением на массив чисел и разворотом его, просто отвратительны.
    Приведение числа к строке - это O(n) если не больше, так как в JS тип number - это по сути float64 и алгоритм приведения учитывает, что число может быть с дробной частью.
    Разбиение строки на массив символов (split) - O(n) и требует доп памяти под этот массив.
    Реверс массива - O(n/2)
    Склейка (join) - опять O(n)
    Сравнение строк - еще раз O(n)
    И хотя суммарная сложность останется O(n), количество проходов по цифрам числа будет в 5 раз больше, хотя даже на строках можно уложится в 1.5 обхода:
    const isPalindrome = num => {
        const s = String(num);
        for (let i = 0; i < s.length / 2; i++) {
            if (s[i] !== s[s.length - i - 1]) return false;
        }
        return true;
    };
    Ответ написан
    4 комментария
  • Что хранит в себе данная функция?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Комментировать
  • Как получить счастливое число?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут всё плохо:
    function isHappy(array){
      // записываем пустой массив в array
      // (не важно что там мы получили, теперь этого нет)
      array = [] 
      // получаем 6 переменных с значением "ничего"(undefined)
      let[x,y,z,b,n,v] = array
      // сравниваем x+y+z == b+n и выкидываем, никак не используя
      // с помощью оператора запятая(,) в if попадает только v
      // как мы знаем во всех переменных undefined - if(undefined) - ложь
      if(x+y+z == b+n,v){
        console.log(`Число ${array} - счастливое!`);
      }
      else{
        console.log(`Число ${array} - несчастливое`);
      }
    }
    // вызываем isHappy с аргументом 000000, который является числом 0, 
    // просто записанным длинно, а не массивом
    isHappy(000000)
    Ответ написан
    8 комментариев
  • Какой факультет выбрать веб программисту?

    @Everybody_Lies
    Не ищи вуз где тебя научат кодить, выбирай любой инженерный или математический факультет, просто для прокачки мозгов.
    Все навыки для разработки всё равно будешь изучать самостоятельно.
    Ответ написан
    Комментировать
  • Ценятся ли программисты-самоучки в странах Евросоюза?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ценятся профессионалы, всем плевать, как этот профессионализм был получен. Но надо понимать, во-первых, что желающих получить blue card много, а мест мало. Поэтому вам придётся конкурировать с целой кучей профессионалов и при прочих равных шансов больше будет у обладателей дополнительной бумажки. Во-вторых, интерес западных работодателей начинается на том уровне профессионализма, который у очень выдающихся программистов достигается лет через пять работы, а у остальных через десять. То есть ваш год самообразования - вообще ничто.

    P.S. Вопрос на ресурсе задавался уже очень много раз. Для программиста критически важно уметь искать информацию самостоятельно.
    Ответ написан
    8 комментариев
  • Как написать функцию TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Что-то вроде такого можно сделать:
    type TestResult<T extends string[] | CustomClass[]> = T extends CustomClass[] ? T : void;
    function test<T extends string[] | CustomClass[]>(data: T): TestResult<T> {
        if (data[0] instanceof CustomClass) {
          return data as TestResult<T>;
        }
    
        return undefined as TestResult<T>;
    }

    https://www.typescriptlang.org/play?#code/CYUwxgNg...

    Но без приведения типов внутри не обойтись. Ну и как писал WbICHA в комментах, такие типы не безопасны для пустого массива, так как в рантайме типов нет, а значит и нет возможности проверить, какого типа пришел пустой массив.
    Ответ написан
    1 комментарий
  • Я так никогда не выучу React. Что это за ошибка?

    tsepen
    @tsepen
    Frontend developer
    Нельзя выучить Реакт не выучив Джаваскрипт, рекомендую начать с JS, иначе дальше тебя ждет еще очень много сюрпризов
    Ответ написан
    Комментировать
  • Как правильно реализовать дженерик?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    typescriptlang.org/play
    spoiler
    type Alph = 'Q' | 'W' | 'E' | 'R' | 'T' | 'Y' | 'U' | 'I' | 'O' | 'P' | 'A' | 'S' | 'D' | 'F' | 'G' | 'H' | 'J' | 'K' | 'L' | 'X' | 'Z' | 'C' | 'V' | 'B' | 'N' | 'M'
    
    type CamelToSnake<T extends string> = T extends `${infer S1}${Alph}${string}` ? T extends `${S1}${infer S2}` ? `${Lowercase<S1>}_${CamelToSnake<Uncapitalize<S2>>}` : T : T;
    type AsdSnake = CamelToSnake<'asdAsdAsd'> // asd_asd_asd
    
    type SnakeToCamel<T extends string> = T extends `${infer S1}_${infer S2}` ? `${Lowercase<S1>}${Capitalize<SnakeToCamel<S2>>}` : T;
    type AsdCamel = SnakeToCamel<'asd_asd_asd'> // asdAsdAsd
    
    type SnakePropToCamel<T extends PropertyKey> = T extends string ? SnakeToCamel<T> : T;
    type CamelPropToSnake<T extends PropertyKey> = T extends string ? CamelToSnake<T> : T;
    
    let camelToSnakeCase: <T extends PropertyKey>(str: T) => CamelPropToSnake<T>;
    
    type CamelObjectToSnake<T extends {[key: string]: any}> = {
      [K in keyof T as CamelPropToSnake<K>]: T[K]
    }
    
    function camelCaseObject<T extends {[key: string]: any}>(obj: T) {
      return Object.entries(obj)
        .reduce((acc, [key, value]) =>
            (acc[camelToSnakeCase(key as keyof T)] = value, acc),
          {} as CamelObjectToSnake<T>
        )
    }
    
    function camelToSnakeKeysOfArrayObject<T extends Array<{[key: string]: any}>>(arr: T) {
      return arr.map(camelCaseObject) as {
        [K in keyof T]: CamelObjectToSnake<T[K]>
      };
    }

    Основано на варианте WbICHA но поддерживает объекты разных сигнатур, типа:
    camelToSnakeKeysOfArrayObject([{
      aaAa: 1,
      bbBb: true
    }, {
      aaAa: 'ggg'
    }]);
    Ответ написан
    8 комментариев
  • Как исправить ошибку "No overload matches this call" в jest.spyOn на приватном методе?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    jest.spyOn имеет 4 перегрузки, которые отделяют обычные поля (в этих перегрузках есть 3й параметр 'get' | 'set'), методы (функциональный тип на инстансе) и static методы (функциональный тип на самом классе).
    Ваш вызов подразумевает как раз метод.
    Проблема в том, что private и protected поля не матчатся как функциональные типы. Приватные поля вообще не имеют типа за пределами класса, а protected имеют тип только в наследнике.

    Остается только обмануть систему типов:
    declare class ViewHack {
      getPosOnScale(currentPos: number): number;
    }
    describe('some method', () => {
      test('should return smth', () => {
        const view = new View('range-slider', settings);
        jest.spyOn(view as unknown as ViewHack, 'getPosOnScale').mockReturnValue(100);
      });
    });
    Ответ написан
    2 комментария
  • Какой алгоритм вычисления кратности чисел более эффективен?

    Adamos
    @Adamos
    Если нужно определить кратность - то берем учебник Математика, 6 класс.
    Глава Признаки кратности 3, 5 и 9 с минимумом вычислений.
    Если же нужно заполнить массив - то потери времени на его заполнение, да в жабоскрипте, на порядки превышают стоимость этой простенькой проверки.
    Может ускорить (а может и замедлить) этот процесс замена в цикле ++i на прибавление того числа, которое действительно надо прибавить для получения следующего кратного - оно циклично повторяется: [3, 2, 1, 3, 1, 2, 3]. Проверка уберется, но вычислений, на самом деле, только прибавится. Зато без ветвления и пустых циклов.
    Ответ написан
    1 комментарий
  • Где ошибка в коде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка в коде ДНК.
    Вставить в PHP фрагмент кода на JavaScript и надеяться, что он заработает - это надо быть альтернативно одарённым человеком.
    Ответ написан
    1 комментарий