Может ли кто-нибудь сказать мне, почему я получаю ошибку при попытке вызвать эту функцию?

#javascript #html #function

Вопрос:

 lt;!doctype htmlgt; lt;htmlgt; lt;scriptgt; function isNumber(value) {  return typeof (value) != "boolean" amp;amp; !isNaN(value) amp;amp; value.length gt; 0; }  function minMaxDefrost(value, min, max) {   if (value.length == 0 || value == "-") return value;  if (!isNumber(value)) return value.substring(0, value.length - 1);   console.log("minMaxDefrost called ")  if (parseFloat(value) lt; min){  return min;  }  else if (parseFloat(value) gt; max){  return max;  }  else {  return Math.floor(value);  } }   minMaxDefrost(4, 0, 12);  lt;/scriptgt; lt;/htmlgt;  
  • Я использую эту функцию в функции html-ключа, и она работает нормально, но когда я пытаюсь вызвать ее самостоятельно в начале кода, я получаю сообщение об ошибке, не пойманное TypeError: значение.подстрока не является функцией
  • также нет, когда я вызываю эту функцию из ключа, который я использую «this.value = minMaxDefrost(это.значение, -80, 150, 0)
  • я предполагаю, что ошибка связана с этим.значением, но я не знаю, как это исправить

Комментарии:

1. Ваша isNumber() функция фактически вернет значение false, если вы введете число… И ты не можешь взять а substring() из числа.

2. Почему ты занимаешься value.length цифрами?

3. аналогично, зачем вам понадобилось работать .substring() с цифрами?

4. @Bergi Я предполагаю, что это для проверки пустых строк во входных данных?

5. Тогда почему бы просто не сделать if( value.constructor !== Number) { ... } это ?

Ответ №1:

isNumber не совсем выполняет свою работу, как предлагает Марк Ханна.. а лучше isNumber было бы что-то вроде

 function isNumber(num){  let num1=num-0, num2=num-1  return num2!=num1 amp;amp; !!(num2||num1) amp;amp; typeof(num)!="object"  //Infinity would fail the test num2!=num1  //Normal non-numbers would fail !!(num2||num1)  //null would fail typeof(null)!="object"  //However, 0, and even "0" will pass this test }  

Вот он возвращен в коде, который вы нам дали

 function isNumber(num){  let num1=num-0, num2=num-1  return num2!=num1 amp;amp; !!(num2||num1) amp;amp; typeof(num)!="object"  //Infinity would fail the test num2!=num1  //Normal non-numbers would fail !!(num2||num1)  //null would fail typeof(null)!="object"  //However, 0, and even "0" will pass this test }  function minMaxDefrost(value, min, max) {   if (value.length == 0 || value == "-") return value;  if (!isNumber(value)) return value.substring(0, value.length - 1);   console.log("minMaxDefrost called ")  if (parseFloat(value) lt; min){  return min;  }  else if (parseFloat(value) gt; max){  return max;  }  else {  return Math.floor(value);  } }   minMaxDefrost(4, 0, 12); 

Ответ №2:

isNumber(4) вычисляется до false , поэтому вы пытаетесь вызвать substring метод 4 , но его не существует. Используйте typeof value === 'number' вместо этого, чтобы проверить, является ли что-то числом. Или еще лучше, используйте typeof value === 'string' , прежде чем относиться к нему так, как будто это определенно строка.