number.isinteger() 不能单独判定合法分页参数,需组合类型检查、数值有效性验证和正整数范围约束;应先转数字再用 number.isfinite 和 number.isinteger 判定,并限定 min/max 范围。

Number.isInteger() 只能判断是否为整数,不能单独用于判定“合法分页参数”——它不检查正负性、不拒绝 NaN、Infinity 或字符串形式的数字,更不处理空值或非数字类型。要严谨判定分页参数(如 page 或 pageSize)是否为合法正整数,需组合类型检查、数值有效性验证和范围约束。
必须先确保是原始数字类型
分页参数常来自 URL 查询字符串(如 ?page=2),此时值是字符串。直接传入 Number.isInteger("2") 返回 false,因为字符串不是数字类型。
- 用
typeof value === 'number'排除非数字类型 - 对字符串先尝试转换:
const num = Number(str),再检查!isNaN(num) && isFinite(num) - 避免使用
parseInt或一元加号(+),它们会静默转换"2abc"为2,造成误判
必须排除非正整数情况
Number.isInteger(-5) 和 Number.isInteger(0) 都返回 true,但分页页码通常要求 ≥ 1。
- 在确认是整数后,额外判断
num > 0 - 若允许
pageSize = 0(极少见),需单独定义业务规则,不可默认放宽 - 注意:
0n(BigInt 零)不是number类型,Number.isInteger(0n)报错,应先确保类型安全
建议封装成可复用的校验函数
把类型转换、整数判断、正数检查、边界限制(如最大页码防爆破)收拢到一个函数中,提高复用性和可维护性:
function isValidPageParam(value, options = {}) {
const { min = 1, max = 10000 } = options;
// 1. 转换并验证基础数值性
const num = Number(value);
if (!Number.isFinite(num)) return false;
// 2. 检查是否为严格整数且在有效范围内
if (!Number.isInteger(num) || num max) return false;
return true;
}
// 使用示例:
isValidPageParam("1") // false(字符串)
isValidPageParam(1) // true
isValidPageParam(0) // false(小于 min)
isValidPageParam(5.0) // true(5.0 是整数)
isValidPageParam(5.1) // false(非整数)
isValidPageParam(NaN) // false
isValidPageParam(Infinity)// false
配合后端做二次校验更稳妥
前端校验仅用于体验优化和初步过滤。攻击者可绕过 JS 直接发请求,因此后端仍须用相同逻辑(如 Node.js 的 Number.isInteger() + 范围判断)再次验证。
- 前后端校验逻辑尽量一致,避免出现前端通过、后端拒绝的不一致行为
- 对异常参数统一返回
400 Bad Request并带明确错误信息,如{"error": "page must be a positive integer"} - 日志记录高频非法参数请求,辅助识别爬虫或恶意探测










