如何限制JS的range()函数仅接受数字参数?抛出错误是否合理?
问题解答
1. 用new Error('input must be a number')抛出错误的方式完全正确
这是JavaScript里处理非法参数的标准操作,能明确告知调用者参数类型不符合要求,而且抛出的错误可以通过try/catch语句捕获处理,不会直接导致程序崩溃(如果需要容错的话)。
2. 如何确保range()仅接受数字类型参数
你需要对所有传入的参数(包括默认值的step)做有效数字校验——注意不能只靠typeof判断,因为typeof NaN返回的也是'number',还要额外排除NaN和Infinity这类无效数字。
可以写一个辅助校验函数复用逻辑,然后在range函数开头就做参数检查,一旦发现非有效数字就抛出错误。
修改后的完整代码
// 辅助函数:检查是否为有效数字 function isValidNumber(num) { return typeof num === 'number' && !isNaN(num) && isFinite(num); } function range(from, to, step = 1) { // 处理单参数情况(先处理,再校验) if (to === undefined) { to = from; from = 0; } // 校验所有参数是否为有效数字 if (!isValidNumber(from)) { throw new Error('input must be a number'); } if (!isValidNumber(to)) { throw new Error('input must be a number'); } if (!isValidNumber(step)) { throw new Error('input must be a number'); } // 额外校验step不能为0,避免死循环 if (step === 0) { throw new Error('step cannot be 0'); } let result = []; // 补充负数step的处理逻辑,让函数更健壮 if (step > 0) { for (let i = from; i < to; i += step) { result.push(i); } } else { for (let i = from; i > to; i += step) { result.push(i); } } return result; } // 正常测试用例 const rango1 = range(5); // [0, 1, 2, 3, 4] const rango2 = range(2, 8); // [2, 3, 4, 5, 6, 7] const rango3 = range(3, 12, 2); //[3, 5, 7, 9, 11] const rango4 = range(10, 2, -2); // [10, 8, 6, 4] console.log(rango1); console.log(rango2); console.log(rango3); console.log(rango4); // 以下调用会抛出错误 // range('string'); // 抛出 Error: input must be a number // range(5, NaN); // 抛出 Error: input must be a number // range(2, 8, 0); // 抛出 Error: step cannot be 0
补充说明
- 加
isFinite检查是因为Infinity的typeof也是number,但传入它会导致循环无法终止,必须排除。 - 补充负数
step的处理,让函数符合常见range工具的预期场景。 - 单独校验
step不能为0,避免出现死循环的风险。
内容的提问来源于stack exchange,提问作者sonEtLumiere
相关产品推荐
相关产品推荐

