Ответы пользователя по тегу JavaScript
  • Как сделать регулярное выражение для положительных и отрицательных чисел?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Вариант решения:
    /^-?\d+\.?\d*$/

    Расшифровка:
    ^ - начало строки
    -? - символ "минус" ноль или один раз
    \d+ - цифры, минимум одна штука
    \.? - символ точки ноль или один раз
    \d* - снова цифры, но в этот раз минимум ноль раз
    $ - конец строки

    Без символов ^$ регексп будет матчиться с подстрокой, например он сработает на строку "123abc"
    Ответ написан
    Комментировать
  • Почему текстовый узел добавляется только в одну ячейку строки?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    for (var i = 0; i < 5; i++) {
        let td = document.createElement("td");
        element.appendChild(td);
        td.appendChild(cnt);
      }
    Нельзя вставить одну и ту же ноду в несколько родителей.

    Вместо этого нужно создавать новую ноду в каждой итерации цикла:
    for (var i = 0; i < 5; i++) {
        let td = document.createElement("td");
        element.appendChild(td);
        let node = document.createTextNode("Help");
        td.appendChild(node);
      }


    Подробнее см. ссылку от 0xD34F:
    узел не может находиться в двух точках документа одновременно.
    Ответ написан
    Комментировать
  • Как поправить ошибку "Uncaught TypeError: addToCart is not a function"?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    У вас вызывается функция при нажатии на кнопку:
    <button id="toCart" onclick = "addToCart()">Добавить в корзину</button>

    Однако объявление этой функции находится внутри цикла и не попадает в область глобальной видимости.
    // Добавление товаров в корзину 
      for(let j; j < products.length; i++) {
        function addToCart(j) {
          cart.push(products[j]);
          console.log(cart)
        };
      }
    Поэтому при нажатии на кнопку выбрасывается ошибка "нет такой функции".

    Скорее всего тут просто перепутаны местами строки. Должно быть:
    // Добавление товаров в корзину 
    function addToCart(j) {
        for(let j; j < products.length; i++) {
          cart.push(products[j]);
          console.log(cart)
        };
      }
    Ответ написан
    Комментировать
  • Как упростить код javascript?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Зависит от того, что с этим кодом планируется делать в дальнейшем.

    Если это разовая работа вида "сдал и забыл", исходники которой которую никому не предполагается смотреть, то можно оставить как есть и не париться. Всё и так работает, а интерпретатору всё равно, насколько понятно написан данный код.

    Однако, как писал Мартин Фаулер, "хороший программист пишет код, понятный человеку". Рано или поздно возникнет необходимость этот код читать. За примерами далеко ходить не надо: обсуждая данный вопрос, мы уже столкнулись с такой необходимостью, а в будущем возможны доработки либо изменения (исправления багов). Следовательно, хороший код должен быть написан понятно, причём понятно для всех, а не только для его автора. Судя по отсутствию каких-либо ответов и комментариев вот уже больше суток, данный код этому критерию не соответствует — никто просто не хочет выполнять бессмысленную работу, разбираясь с длинным запутанным листингом.

    Но что значит "понятно"? Кому понятно? Но что такое вообще "хорошо написанный код"? Как узнать, что с данным конкретным кодом что-то не так, и главное, как это исправить? На эту тему было написано множество книг, многие из которых стали классикой разработки: Р. Мартин, Г. Ларман, М. Фаулер, "банда четырёх" и прочие. Это целая наука, на одно знакомство с которой может потребоваться не один год; нет никакой возможности уместить всё в один ответ из нескольких абзацев.

    Вдвойне сложно обсуждать это на данном конкретном примере — к сожалению, он сделан в том стиле, в котором веб-разработка находилась примерно лет двадцать назад. Тогда сложных веб-приложений было мало, и в общем-то являлось нормой смешивать логику и представление в одном файле, в итоге превращая его в спагетти из html, php и javascript. От такой практики отошли, разделяя представление (разметку) и поведение (код на php) и вынося клиентские скрипты, где затем их можно было декомпозировать на отдельные переиспользуемые элементы.

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

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

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

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

    В лучшем случае для добавления функциональности нужно добавить какой-то элемент (например, класс). При этом старый (протестированный и рабочий) код не меняется, а значит, не возникает риска появления новых багов. Такой подход называется расширяемостью.
    Несколько хуже, если нужно изменение, т.е. правка старого кода. После такой правки работавший ранее код потребуется перетестировать. В общем и целом это всё ещё нормально — главное, код должен быть написан так, чтобы даже стороннему разработчику было понятно, где и какую правку нужно внести.
    Плохо, если изменения потребуются в нескольких местах. И совсем никуда не годится, если эти места никак не связаны друг с другом, или связаны как-то неочевидно. В этом случае исправление выльется в череду бесконечных проб и ошибок (поправил в одном месте — отвалилось в другом — подебажил — поправил в другом — всё равно не работает — опять подебаджил — оказалось что проблема вообще не там — не смог найти, где проблема — откатил и т.д.). Такой код считается "плохим", потому что он создаёт лишнюю работу, а значит, неоправданно повышает расходы на разработку. В современных реалиях подобного подхода к разработке стараются избегать.
    Ответ написан
    Комментировать
  • Проблема с джава скриптом, пишет ошибка при выполнении функции, как решить?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    document.getELementById is not a function

    Метода "getELementById()" у объекта document нет, есть только "getElementById()". Как и подавляющее большинство языков программирования, JavaScript чувствителен к регистру, поэтому здесь мы получаем ошибку.
    Ответ написан
  • Почему в консоли написано, что контекст null, но если раскрыть объект current - то видно, что контекст есть?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Сложно сказать точно не видя кода, но скорее всего, вывод в консоль происходит до присваивания значения полю current. Получение значений полей происходит непосредственно при раскрывании объекта в консоли, поэтому отображается значение, которое там действительно есть в момент раскрывания, но которого не было в момент логирования.

    Есть несколько вариантов, как обойти эту проблему:
    • Логируйте непосредственное значение, которое вас интересует: console.log(mapRef.current)
    • Сериализуйте объект перед логированием, чтобы увидеть его значения на момент логирования: console.log(JSON.stringify(mapRef))
    • Логируйте значения непосредственно перед использованием

    Каждый из них имеет свои недостатки, поэтому лучший способ — перейти от отладки через console.log на использование браузерного отладчика.
    Ответ написан
    Комментировать
  • Кто хорошо знает javascript, элементарный вопрос?

    enkryptor
    @enkryptor
    software developer (TS/JS, python, C#)
    Если совсем в двух словах. Интерпретатор делает не то, что мы от него хотим, а то, что мы от него запросили. А знаком "плюс" в JS можно запросить две разные операции.

    Одна — это склеивание строк: "aaa" + "bbb" = "aaabbb"

    Вторая — это арифметическое сложение: 333 + 222 = 555

    В остальной арифметике — деление, вычитание и т.п. — такой двойственности нет. Нельзя, например, вычесть одну строку из другой: "aaa" - "bbb" = ?, поэтому для строк при использовании знака "минус" JS автоматически приводит строку к числу и мы получаем ожидаемый результат: "333" - "222" = 111

    Но для знака "плюс" такое не работает, т.к. интерпретатор не знает, что нам нужно, и делает то, что ему сказали:
    333 + 222 = 555
    
    "333" + "222"  = "333222"

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