math.sign() 返回1、-1、0、-0、nan五种值,分别对应正数、负数、+0、-0和非有效数字;其优势在于直接映射符号位、正确处理infinity、避免隐式转换风险。

Math.sign() 是 ES6 中最直接、轻量的正负零判断工具,一行调用就能区分 +1、-1、0、-0、NaN 五种状态,无需手动比较或类型转换。
它返回哪五种值?
结果严格对应数值的底层符号位:
- 正数(包括
+Infinity)→1 - 负数(包括
-Infinity)→-1 - 正零
+0→0(控制台显示为0) - 负零
-0→-0(可被Object.is(-0, Math.sign(-0))精确识别) - 无法转为有效数字(如
'abc'、undefined、null以外的非数字值)→NaN
和手写判断比有什么优势?
不用写 x > 0、x 、<code>x === 0 三重逻辑,也避开 -0 === 0 返回 true 的陷阱:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
Math.sign(-0)明确返回-0,而-0 === 0是true -
Math.sign('2')自动转为数字再判断,等价于Math.sign(2);但'2' > 0会隐式转字符串比较,有风险 - 对
Infinity和-Infinity也能正确返回1或-1,而isFinite()无法覆盖这类情况
常见误判场景怎么处理?
注意输入不是数字时的隐式转换行为:
-
Math.sign(null)→0(因为+null === 0) -
Math.sign(undefined)→NaN(因为+undefined === NaN) -
Math.sign({})→NaN({}.toString()是'[object Object]',无法转数字) - 若需严格只接受数字类型,建议先加一层
typeof x === 'number' && !isNaN(x)校验
实用小技巧
配合其他方法快速落地:
- 判断是否为负数:
Math.sign(x) === -1 - 统一归零处理(忽略 ±0 差异):
Math.sign(x) === 0 ? 0 : Math.sign(x) - 做符号翻转:
x * Math.sign(y)可让x拥有y的符号 - 替代旧式兼容写法:
Math.sign = Math.sign || function(x) { return x ? x > 0 ? 1 : -1 : x; };(注意该 polyfill 不处理-0)










