math.hypot() 是 javascript 中安全计算欧几里得范数的函数,通过缩放算法避免大数平方溢出,支持多参数、自动取绝对值,返回 nan、0 或 infinity 符合规范,es6 起广泛支持。

Math.hypot() 是 JavaScript 中专门用于计算欧几里得范数(即 √(x² + y² + …))的安全函数,它能有效避免在计算大数值的平方和时发生中间溢出(如 x * x 或 y * y 超出 Number.MAX_VALUE)。
为什么不用手动写 Math.sqrt(x*x + y*y)?
直接平方相加再开方看似直观,但当 x 或 y 很大(例如接近 1e200)时,x * x 会立即变成 Infinity,导致结果错误;即使其中一个值很大、另一个很小,也可能因浮点精度损失或溢出而失准。Math.hypot() 内部采用缩放算法(如先提取最大绝对值,再对其他项按比例缩小后计算),从根源上规避了中间平方溢出。
如何用 Math.hypot() 计算直角三角形斜边
对于直角边长度为 a 和 b 的直角三角形,斜边 c = √(a² + b²),可直接传入两个参数:
-
Math.hypot(a, b)—— 自动处理正负号(取绝对值后再运算) - 支持任意多个参数,如
Math.hypot(a, b, c)可算三维空间距离 - 若输入含
NaN,返回NaN;若全为零,返回0;若任一参数为±Infinity,返回Infinity
实际使用示例与对比
以下例子展示溢出风险与 hypot 的稳健性:
const big = 1e200; console.log(big * big); // Infinity → 溢出 console.log(Math.sqrt(big*big + 1)); // NaN(因为 Infinity + 1 === Infinity,√Infinity === Infinity,但此处因精度问题可能不稳定) <p>console.log(Math.hypot(big, 1)); // 1e200(正确,无溢出,结果合理) console.log(Math.hypot(3, 4)); // 5 console.log(Math.hypot(-3, 4)); // 5(自动取绝对值) console.log(Math.hypot(0, -0)); // 0</p>
注意事项与补充建议
Math.hypot() 是 ES6 标准方法,现代浏览器和 Node.js(≥ v6.0.0)均支持。若需兼容极旧环境,可使用 polyfill(基于缩放逻辑模拟),但一般无需自行实现。
- 始终传入数字类型;字符串会尝试转换,
Math.hypot("3", "4")也返回5,但隐式转换可能引入意外行为,建议显式转换 - 不适用于复数或向量对象——需先提取实部/分量再传入
- 性能略低于直接平方开方,但为安全性和健壮性值得牺牲(尤其在不确定输入范围时)










