• Почему все называют TypeScript компилируемым языком программирования?

    vabka
    @vabka
    Токсичный шарпист
    1. Если душнить, то никто не называет TypeScript компилируемым языком.
    Вот например что написано на официальном сайте на самом верху:

    TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.


    2. У typescript есть компилятор tsc - его называют компилятором, потому что он по определению им является.

    Но стоп, компиляция - это процесс перевода "человеческого" кода в машинный код.

    Нет. Даже если брать определение из википедии, то будет:

    In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).

    Никакой речи о "машинном коде" нет, как видишь)

    А если совсем душнить, то языки не делятся на компилируемые и интерпретируемые - это детали реализации.
    В теории для любого языка можно написать компилятор/транслятор или интерпретатор (и так действительно делают)

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

    2. В англоязычном интернете transpiler наоборот являются подмножеством compiler.
    Compiler - такая программа, которая преобразует код с одного языка на другой, причём из одного файла может получиться N файлов.
    А tanspiler - это такая программа, которая берёт исходный код на одном языке, и преобразует его в исходный код на другом языке, причём 1 файл преобразуется ровно в 1 файл.

    Получается, что tsc - это транслятор/транспайлер, а причислять их к компиляторам или нет - это дискуссионный вопрос.
    Ответ написан
    2 комментария
  • Когда новичку нужно изучать как работает интернет, после изучения базы JS?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Уважаемый пользователь.
    У тебя из 10 вопросов 9 вопросов про то. как стать разработчиком и поменьше учить.
    Прекрати такое поведение.

    Не хочешь учиться - выбери другое направление, кроме ИТ полный мир возможностей.
    Ну или учи свою верстку, работай всю жизнь джуниором, никто тебя за уши в сеньоры не тянет и не заставляет.
    Хочешь - учи, не хочешь - не учи.
    Читай вакансии и требования в вакансиях, зачем тебе советы рандомных людей из интернета, если ты постоянно спрашиваешь почти одно и тоже, хотя тебе уже отвечали.
    Ответ написан
    18 комментариев
  • Как работает замыкание в js?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    function createCounter() { 
        let counter =0; 
       counter = counter - 10  
        const myFunction = function () { 
            counter = counter+1; 
            return counter 
        } 
        return myFunction 
    } 
    let z = createCounter() // Вернули в переменную z функцию "myFunction" у которой в замыкании есть counter.
    // counter внутри на данный момент равен -10.
    
    // Вызвали функцию и вывели результат в консоль.
    // Так как внутри функции counter берётся из замыкания, то при вызове функции получаем
    // -10 + 1
    console.log(z()) // -9
    
    // В данном примере - бесполезный ничего не делающий вызов.
    // То есть создаётся ещё один НОВЫЙ счётчик, со своим замыканием, но он никуда не сохраняется.
    createCounter() 
    
    // Снова вызвали функцию и вывели результат в консоль.
    // -9 + 1 
    console.log(z()) //  -8


    где я допускаю ошибку

    Судя по всему Ваша ошибка в том, что Вы считаете, раз снова вызвали функцию createCounter - то это на что-то влияет. Но нет. Это отдельный новый вызов нового счётчика, который потом в данном примере нигде не используется.

    Второй вопрос откуда берется counter при втором вызове console.log(z())

    Да всё оттуда же. Из замыкания. Когда Вы в первый раз вызвали функцию createCounter и сохранили результат её работы в переменную z - Вы в переменную z поместили функцию myFunction, у которой есть своё собственное замыкание на counter.
    При каждом вызове z() будет вызываться та созданная функция со своим замыканием и оперировать с counter из него.

    При новом вызове createCounter возвращается НОВАЯ функция myFunction у которой своё независимое от предыдущих вызовов замыкание.
    То есть createFunction это как фабрика, которая выпускает одинаковые изделия(счётчики от -10, в данном случае), но изделия не зависят друг от друга.
    Ответ написан
  • Как просуммировать вложенные массивы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupedArr = arr.reduce((acc, n) => {
      const keys = n.slice(0, -1);
      let group = acc.find(m => m.length === n.length && keys.every((k, i) => k === m[i]));
      if (!group) {
        acc.push(group = [ ...keys, 0 ]);
      }
      group[keys.length] += n[keys.length];
      return acc;
    }, []);

    или

    const groupedArr = arr.reduce((acc, n) => {
      const keys = n.slice(0, -1);
      const groups = keys.reduce((groups, k) => groups.set(k, groups.get(k) ?? new Map).get(k), acc[1]);
      let group = groups.get(acc[2]);
      if (!group) {
        acc[0].push(group = [ ...keys, 0 ]);
        groups.set(acc[2], group);
      }
      group[keys.length] += n[keys.length];
      return acc;
    }, [ [], new Map, Symbol() ])[0];
    Ответ написан
    1 комментарий
  • Можно ли сделать ссылку динамической?

    @rusindex Автор вопроса
    Начинающий програмист
    решение если кому то нужно.
    В require как я понял нельзя использовать переменные внутри. Поэтому я загрузил файлы на сайт и доступ к файлам получил через
    useEffect(() => {
        fetch('https://prava74.ru/questions/AB/tickets/'+istr+'.json')
          .then((response) => response.json())
          .then((json) => setData(json))
          .catch((error) => console.error(error))
          .finally(() => setLoading(false));
      }, []);


    все получилось.
    Ответ написан
    1 комментарий
  • Можно ли сделать перегрузку функции с помощью типа?

    type FunctionDinamicParams = <T extends keyof TMap>(eventName: T, params: TMap[T]) => Promise<void>;
    Ответ написан
    3 комментария
  • Как отслеживать смену значений в объекте?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Заворачиваете свой объект в Proxy:

    const obj = {
      a: 69,
      b: 187,
      c: 666,
    };
        
    const proxy = new Proxy(obj, {
      set(target, key, val) {
        console.log(`${key} changed from ${target[key]} to ${val}`);
        target[key] = val;
        return true;
      },
    });

    Дальше вместо исходного объекта работаете с экземпляром Proxy.
    Ответ написан
    2 комментария
  • Как отслеживать смену значений в объекте?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Есть два основных варианта:
    1) Использовать get и set
    2) использовать Proxy
    Ответ написан
    Комментировать
  • Хотят оформить на работу через ИП,стоит ли?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Только в одном случае - если компания западная, платит в валюте и много.
    Ответ написан
  • Как сделать синхронный запрос через fetch?

    Immortal_pony
    @Immortal_pony Куратор тега JavaScript
    1. Можете воспользоваться XMLHttpRequest вместо fetch. В методе open можно явно указать, что запрос необходимо сделать синхронно. Подробная документация тут: https://javascript.info/xmlhttprequest
    2. Можете воспользоваться тем что fetch возвращает promise и написать свой код соответствующим образом. Вы уже почти это сделали когда решили возвращать результат выполнения fetch. Осталось чуть-чуть, примерно так:

    getDataByINN(myPersonPars['INN']).then((suggestion) => {
        const myCompany = suggestion
    })
    Ответ написан
    4 комментария
  • Как передать элемент для удаления?

    @ParaBellum577
    Просто передайте в Note функцию, которая принимает индекс элемента, а потом по индексу убирайте из массива нужный элемент (Ну или по id, как угодно)
    <Note 
                    removeElement={() => handleDelete(index)}
                />

    А сама функция что-то вроде этого
    const [notes, setNotes] = useState([тут ваши Notes])
      const handleDelete = (index) => {
        let newNotes = [...notes];
        newNotes[index].splice(index, 1);
        setNotes(newNotes);
      };
    Ответ написан
    Комментировать
  • CMS для сайта на HTML?

    Mike_Ro
    @Mike_Ro
    React/Django, WordPress, SEO, автоматизация, ML
    Без js или любого серверного ЯП - никак.
    Ответ написан
    3 комментария
  • Что означает "!!~"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сокращалка, удобная для indexOf(), который возвращает -1 если не найдено, или индекс от 0 и больше.

    Для логики приложения часто бывает нужно узнать только, найдено или нет: т.е. -1 или иное значение. Можно просто сравнивать if (a.indexOf(b) > -1) { /* найдено! */ } но иногда хочется короче.

    Битовый оператор НЕ ~ хорош тем, что выделяет -1: только -1 с этим оператором даст 0. Прочие числа дадут какое-то ненулевое значение.

    ~(-1) === 0

    Остаётся привести значение из численного в булево. Для этого два воскл. знака — два логических НЕ.
    • для варианта «найдено» из числа от 0 и больше получилось тоже ненулевое число, и !! даст true
    • для варианта «не найдено» из -1 получится уникальный 0, и !!0 вернёт false
    Ответ написан
    4 комментария
  • Что наследуется в ООП? Как работает наследование?

    Adamos
    @Adamos
    Publlic / protected / private - это архитектура. Компьютеру они на хрен не нужны, они ограничивают программиста.
    И уж если программист считает, что метод должен быть публичным - значит, любой наследник должен его реализовывать. Если приватным - значит, нечего в него лезть наследникам. Если защищенный - значит, только этот класс и его наследники о том, что он существует, и должны знать.

    А если у вас сын утки плавает, как утка, но молчит, как рыба - это не он урод, а вы с планированием классов обосрались. Нет, не тот парень, от чьих классов вы наследуетесь, а именно вы. И те парни, которым надо будет поддерживать ваш код (если они знают не только о принципе Лисков, но и где вы живете) смогут очень доходчиво вам это объяснить.
    Ответ написан
    5 комментариев
  • Пытаюсь написать игру "Камень, ножницы бумага", как исправить ошибки в данном коде?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Ответ написан
    Комментировать
  • Как обрезать строку в Javascript?

    @Spaceoddity
    function truncateString(str, num) { // функция принимает два аргумента - саму строку и ограничение длины строки
    
      if (str.length > num) { // если длина строки больше ограничения
        return str.slice(0, num) + "..."; // обрезаем строку до ограничения, в конце добавляем многоточие (sic!) и возвращаем 
      } else { // в противном случае
        return str; // возвращаем исходную строку
      }
    }

    Вторая функция делает всё то же самое, только записана в одну строчку - https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
    Комментировать
  • Как протестировать верстальщиков?

    Aetae
    @Aetae
    Тлен
    Если ты шаришь в теме - посмотри последние коммиты и всё ясно станет.
    Если ты эффективный менеджер - иди нафиг.
    Ответ написан
    Комментировать
  • Написал js, но, думаю, тут можно его сократить (оптимизировать)?

    Raxen
    @Raxen
    Lead Frontend Developer, Beeline
    Способ определения оставленного комментария на ваше усмотрение, сократить можно так

    const { hash, href } = window.location;
    const urlc = href.replace(hash, '');
    
    if (hash && decodeURIComponent(readCookie('commentadd')) === urlc) {
      alert("Комментарий оставлен");
    }

    или так

    const { hash, href } = window.location;
    
    if (hash && href.includes(decodeURIComponent(readCookie('commentadd')))) {
      alert("Комментарий оставлен");
    }
    Ответ написан
    Комментировать
  • Как реализовано это подчеркивание?

    Подчёркивание добавляется спец. символом &#x0332; – он делает предшествующий символ подчёркнутым.

    Целый класс «диакритических» юникод символов модифицирует предшествующий им символ, добавляя акцент, подчеркивание и т.п. См. Unicode diacritical marks

    Пример:
    Ответ написан
    5 комментариев