算两个数相差多少,直接相减遇到负数就抓瞎:9 减 5 得 4,5 减 9 得 -4,可差值本来就该是 4。这时候就该 js 绝对值登场了,JavaScript 里取绝对值用的是 Math 对象下的 abs 方法。
基本用法
写法是 Math.abs(数字),正负通吃:Math.abs(-4) 返回 4,Math.abs(3.5) 返回 3.5,Math.abs(0) 返回 0。算两数差值的常见套路是 Math.abs(a - b),不管谁大谁小,结果都是非负差值,比较两个时间戳差几秒、两个坐标差几个像素都这么写。顺手记一个相关函数 Math.sign,它返回数字的正负号,一个管大小一个管方向,经常搭配出现。
几个容易踩的坑
- 参数会先转成数字:Math.abs('-3') 返回 3,字符串里的负号也能识别
- 转不成数字就返回 NaN:Math.abs('abc') 和 Math.abs(undefined) 都是 NaN,NaN 一路参与运算,页面就静默出错,接口传参前先校验类型
- 不传参数是 NaN,传 null 却返回 0,边界处理时留意
替代写法了解一下就行
老代码里偶尔能看到三元表达式:x < 0 ? -x : x,效果等价。现代引擎里这点性能差异可以忽略,可读性上 Math.abs 一眼懂,没有特殊理由就用标准方法。整数取绝对值还有种位运算写法,靠按位或 0 抹掉小数再取反,代码晦涩、数值超范围还会出错,新代码别这么写,能读懂就行。
举个实际场景:下单时判断库存够不够,Math.abs(下单数量 - 库存量) 得出缺口;画布上算两点水平距离也靠它。凡是「差多少」而不关心方向的计算,先想到绝对值。
实际建议:业务代码统一用 Math.abs,输入来源不可控时先做数字校验再取值,兜底检查可以用 Number.isNaN。js 绝对值就这一个函数,记住 Math.abs 这个名字就够了。