<!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.