Home > Net >  Can anyone tell me why I get a error when i try to call this function?
Can anyone tell me why I get a error when i try to call this function?

Time:11-12

<!doctype html>
<html>
<script>
function isNumber(value) {
    return typeof (value) != "boolean" && !isNaN(value) && value.length > 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) < min){
        return min;
        }
    else if (parseFloat(value) > max){
        return max;
        }
    else {
        return Math.floor(value);
    }
}


minMaxDefrost(4, 0, 12);

</script>
</html>
  • I use this function in a html keyup function and it works fine but when i try to call it by itself at the start of the code i get the error message Uncaught TypeError: value.substring is not a function
  • also not when i call this function from the keyup i use "this.value = minMaxDefrost(this.value, -80, 150, 0)
  • im assuming the error has got to do with the this.value but i dont know how to fix it

CodePudding user response:

isNumber doesn't exactly do its job as Mark Hanna suggests.. a better isNumber would be something like

function isNumber(num){
  let num1=num-0, num2=num-1
  return num2!=num1 && !!(num2||num1) && 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
}

Here is it returned in the code you gave us

function isNumber(num){
  let num1=num-0, num2=num-1
  return num2!=num1 && !!(num2||num1) && 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) < min){
        return min;
        }
    else if (parseFloat(value) > max){
        return max;
        }
    else {
        return Math.floor(value);
    }
}


minMaxDefrost(4, 0, 12);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>

CodePudding user response:

isNumber(4) evaluates to false, so you're trying to call a substring method on 4 but that doesn't exist. Use typeof value === 'number' instead to test if something is a number. Or better yet, use typeof value === 'string' before treating it like it's definitely a string.

  • Related