не могу понять почему не выводится alert когда данные введены не корректно
<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>
Ответы (2 шт):
все решил объявил переменную value
function go () {
let value = num.value
if (!isNaN(value)) {
res.value = value * value
} else {
alert('вы ввели не число')
}
}
/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 onclick="go()">нажми на меня </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). В этом случае это не имеет значения, просто привычка.
. — означает любой символ кроме переноса строки. Поэтому если хочется совпадения конкретно с точкой, символ нужно дополнительно экранировать \.