调用minMaxDefrost时报value.substring不是函数错误是什么原因?
问题根因
- 你编写的
minMaxDefrost函数默认是按照入参value为字符串类型设计的(HTML输入框的this.value固定返回字符串,所以keyup事件调用时正常),直接调用时传的是数字类型的4,数字类型没有length属性和substring方法,触发类型错误。 - 具体执行逻辑:传入数字4时,第一步判断
value.length == 0,数字的length为undefined,第一个判断不通过;进入isNumber判断时,数字的value.length>0返回false,导致isNumber整体返回false,触发value.substring逻辑,最终抛出类型错误。
修复方案
修改代码兼容字符串、数字两种入参类型即可,修改后完整代码如下:
<!doctype html> <html> <script> function isNumber(value) { // 统一转字符串判断长度,兼容数字入参 const valStr = String(value) return typeof (value) != "boolean" && !isNaN(value) && valStr.length > 0; } function minMaxDefrost(value, min, max) { const valStr = String(value) if (valStr.length == 0 || valStr == "-") return value; if (!isNumber(value)) return valStr.substring(0, valStr.length - 1); console.log("minMaxDefrost called ") const numVal = parseFloat(value) if (numVal < min){ return min; } else if (numVal > max){ return max; } else { return Math.floor(numVal); } } // 两种调用方式都可正常运行 minMaxDefrost(4, 0, 12); // 输入框调用可保留原有写法:this.value = minMaxDefrost(this.value, -80, 150) </script> </html>
修复说明:
- 所有涉及
length、substring的字符串操作,先将入参转为字符串处理,兼容不同类型入参 - 数值比较前统一用
parseFloat转数字,避免隐式类型转换异常 - 原有输入框调用时传入的第四个参数
0为冗余参数,函数未定义接收逻辑,可直接删除不影响运行
内容的提问来源于stack exchange,提问作者Ben reaby
相关产品推荐
相关产品推荐

