не могу понять почему не выводится alert когда данные введены не корректно

Рейтинг: -1Ответов: 2Опубликовано: 01.02.2023
    <input placeholder="введите число" id="one">
    <input placeholder="здесь появится результат " disabled="true"  id="two">
    <button onclick="go()">нажми на меня </button>

    <script >
        const num = document.getElementById('one')
        const res = document.getElementById('two')
        const btn= document.querySelector('button')

        function go () {                
          if (value=/1.....9/){
            res.value=num.value*num.value
          } else {
            alert('вы ввели не число')
          }
        }
    </script>

Ответы

▲ 0Принят

все решил объявил переменную value

function go () {
  let value = num.value
  if (!isNaN(value)) {
    res.value = value * value
  } else {
    alert('вы ввели не число')
  }
}
▲ 0

/1.....9/ — это вообще регулярное выражение, и его точно так же можно хранить в переменной, как какую-нибудь строку.

let value = /1.....9/
console.log(value); // >>> /1.....9/

У вас в условии происходит обычное присваивание.
А совпадение с регулярным выражением выполняют не через оператор сравнения ==, а через специальный метод /выражение/.test(строка_для_проверки). Но корректная регулярка для проверки на число не самая простая:

/^\s*-?\d+(?:\.\d+)?\s*$/.test('12345');

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

Но в простейших случаях, число/не число проверяют через встроенный метод isNaN Он пробует превратить переданный аргумент в число и возвращает true, если не получилось. У него одна проблема, null, пустую строку и пробельную строку превращает в 0 и считает числом. Поэтому дополнительно надо гарантировать, что не прилетел пробел или пустая строка.

const num = document.getElementById('one')
const res = document.getElementById('two')
const btn= document.querySelector('button')

function go() {
    let val = num.value.trim(); // удаляет пробелы вначале и в конце строки.
    let is_number = val && !isNaN(val);
    // Сначала проверка на val -> Пустая строка считается false.
    
    if (!is_number) {
        alert('вы ввели не число');
        return;
    }
    
    /***/
    val = Number(val);
    res.value = val * val;
}
<input placeholder="введите число" id="one">
<input placeholder="здесь появится результат " disabled="true"  id="two">
<button>нажми на меня </button>

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

Обращаю внимание, в num.value (val) изначально хранится строка, а не число. На всякий случай, перед работой с числом, не плохо бы в самом верху его явно превратить непосредственно в число.
Т.к. '2' * '2' = 4, но '2' + '2' = '22'

P.s. isNaN так же посчитает числом пустой массив, или массив, состоящий из одного элемента, который может стать числом, isNaN(['123']) // false, но в этой задаче массивов нет.


Оффтоп: Разберу приведенную выше реглярку. /^\s*-?\d+(?:\.\d+)?\s*$/

^ — начало строки, $ - конец строки. Требую, чтобы переданное выражение совпадало со всей строкой от начала до конца, т.к. фыв12 не должно быть true, если в нем просто встречались цифры.

\s (space) — любой пробельный символ. * — ноль штук или много раз подряд.
\d (digit) — любая цифра. + — от 1 до много раз подряд.
? — 0 или 1 раз (т.е. не обязательно)
(?:) — если комбинация ?: указана вначале скобок, скобки будут работать не как «группа захвата» (capture group). В этом случае это не имеет значения, просто привычка.

. — означает любой символ кроме переноса строки. Поэтому если хочется совпадения конкретно с точкой, символ нужно дополнительно экранировать \.