Number.isSafeInteger用于判断值是否为安全整数,即满足是整数且在-(2⁵³-1)到2⁵³-1范围内;非number类型返回false,NaN、Infinity、小数及超限整数均返回false。

Number.isSafeInteger 用于判断一个值是否为“安全整数”,即在 -(2<sup>53</sup> - 1) 到 2<sup>53</sup> - 1 范围内、且能被精确表示的整数。它看似简单,但在实际使用中存在几处容易被忽略的边缘情况。
非数字类型参数会被直接返回 false
该方法不会尝试类型转换,只要传入的不是 number 类型(或无法被隐式转为 number 的原始值),结果一律为 false。
-
Number.isSafeInteger("123")→false(字符串,不是 number) -
Number.isSafeInteger(null)→false(null 是 object 类型) -
Number.isSafeInteger(undefined)→false -
Number.isSafeInteger(NaN)→false(NaN 是 number 类型,但不满足整数条件)
超出安全整数范围的大整数会返回 false
即使数值看起来是整数,只要其绝对值 ≥ 2<sup>53</sup>,就不再“安全”——JavaScript 的 IEEE-754 双精度浮点格式无法保证其唯一精确表示。
-
Number.isSafeInteger(9007199254740991)→true(2<sup>53</sup> - 1) -
Number.isSafeInteger(9007199254740992)→false(2<sup>53</sup>,开始丢失精度) -
Number.isSafeInteger(10<sup>16</sup>)→false(远超安全上限)
注意:像 9007199254740992 这样的数,在 JS 中可能与 9007199254740993 表示为同一个值,导致比较、去重等逻辑出错。
立即学习“Java免费学习笔记(深入)”;
小数和 Infinity/-Infinity 均不满足条件
安全整数必须同时满足两个条件:是整数 + 在安全范围内。任何带小数部分或特殊值都不符合。
-
Number.isSafeInteger(1.0)→false(虽然数学上等于 1,但 JS 中1.0是 number 类型,isSafeInteger内部会先用Number.isInteger检查是否为整数,而1.0通过了;但这里真正的问题是——1.0实际上等价于1,所以这个例子结果其实是true。更准确的例子是:Number.isSafeInteger(1.5)→false) -
Number.isSafeInteger(0.0)→true(0.0是整数,且在安全范围内) -
Number.isSafeInteger(Infinity)→false -
Number.isSafeInteger(-Infinity)→false
关键点在于:Number.isSafeInteger(x) 等价于 Number.isInteger(x) && Math.abs(x) 。因此,必须先过整数判定这一关。
BigInt 不被支持,会直接返回 false
Number.isSafeInteger 只接受 number 类型。传入 BigInt(如 123n)会因类型不符而返回 false,哪怕该 BigInt 在数学意义上完全精确。
-
Number.isSafeInteger(123n)→false(TypeError 不会抛出,但结果是 false) - 若需校验 BigInt,应自行检查是否在安全整数范围内,例如:
value = -9007199254740991n
不能混用 number 和 BigInt 直接比较(如 123n === 123 为 false),需显式转换并注意溢出风险。


















