Math.sign() 用数字返回符号状态:正数→1,负数→-1,+0→0,-0→-0,无效数字→NaN;可区分-0、适配计算、避免静默错误。

Math.sign() 是最直接、零判断逻辑的正负性探测方式——它不返回布尔值,而是用数字本身表达符号状态,天然适配计算与分支。
核心返回规则一目了然
传入任意值,Math.sign() 会先尝试转为数字,再按以下规则返回:
- 正数(含
Infinity)→ 返回 1 - 负数(含
-Infinity)→ 返回 -1 - 正零
0→ 返回 0 - 负零
-0→ 明确返回 -0(可被Object.is(x, -0)区分) - 无法转为有效数字(如
'abc'、undefined、NaN)→ 返回 NaN
比 if/else 更快的符号分支写法
不用写 if (x > 0) {...} else if (x ,直接用返回值做数值运算或映射:
- 统一方向:
Math.sign(x) * Math.abs(y)—— 把 y 的大小赋予 x 的符号 - 排序分组(先正、再零、后负):
arr.sort((a, b) => Math.sign(a) - Math.sign(b)) - 安全取反符号:
const inverted = -Math.sign(x),无需担心-0变成0
注意边界:-0 和 NaN 不是“异常”,而是明确语义
Math.sign(-0) 返回 -0,不是 bug,而是保留 IEEE 754 符号位的设计。这意味着:
- 它能区分
0和-0(0 === -0为 true,但Math.sign(0) !== Math.sign(-0)) -
NaN输入返回NaN,符合“无效输入 → 无效符号”的直觉,避免静默错误 - 字符串如
'-5'会被隐式转为数字,Math.sign('-5')正常返回 -1
替代方案对比:什么时候该用它?
单纯判断“是否为负”?x 更轻量;但需要符号参与后续计算、归一化、方向控制或处理 <code>-0 场景时,Math.sign() 就不可替代:
- ✅ 整数反转(保留原符号):
Math.sign(n) * parseInt(String(Math.abs(n)).split('').reverse().join('')) - ✅ 向量单位化、物理方向归一、UI 滑动方向判定
- ❌ 仅需
true/false时,用比较运算符更高效

















