number.issafeinteger用于检测值是否为可精确表示的安全整数,要求先为整数且在±9007199254740991范围内;非整数直接返回false,不转换类型;实际使用应配合number.isinteger校验类型。

Number.isSafeInteger 专门用来检测一个值是否为“安全整数”,它不负责判断“是不是整数”,而是聚焦在“这个整数能不能被 JavaScript 精确表示”。检测超大整数是否安全,关键就两点:它必须是整数,且落在 ±(2⁵³−1) 范围内。
先确认是不是整数(不能跳过)
Number.isSafeInteger 对非整数一律返回 false,包括小数、NaN、Infinity、字符串、null 等。它不会做类型转换,也不会尝试解析数字字符串:
-
返回 true 的只有真正的整数数值:比如
42、-0、9007199254740991 -
以下全部返回 false:
3.14、"9007199254740991"、NaN、Infinity、true、null
再核验是否在安全范围内(±9007199254740991)
安全整数范围是 Number.MIN_SAFE_INTEGER 到 Number.MAX_SAFE_INTEGER,即 −9007199254740991 到 9007199254740991(含端点)。超出这个区间,二进制表示就可能不唯一,导致计算出错:
-
Number.isSafeInteger(9007199254740991)→ true -
Number.isSafeInteger(9007199254740992)→ false(多 1 就越界) -
Number.isSafeInteger(-9007199254740991)→ true -
Number.isSafeInteger(-9007199254740992)→ false
为什么不能只用 isSafeInteger?
它本身不拦截非整数输入。比如后端传来的 ID 是字符串 "9007199254740992",直接调用 Number.isSafeInteger("9007199254740992") 得到的是 false,但这不是因为“不安全”,而是因为“根本不是 number 类型”。所以真实场景中,应搭配 Number.isInteger 使用:
- 正确姿势:
Number.isInteger(x) && Number.isSafeInteger(x) - 错误做法:只用
Number.isSafeInteger(x),可能掩盖类型问题
兼容旧环境的等效写法
如果需要支持 IE 等不支持 ES6 的环境,可手动实现逻辑:
typeof x === 'number' && isFinite(x) && Math.floor(x) === x && x >= Number.MIN_SAFE_INTEGER && x











