JavaScript中优雅解决数组符号乘积计算返回负零问题
负零问题的简洁解决方法
JS中-0是带符号位的特殊零值,和0做===判断时返回true,但直接输出会显示为-0,不需要写独立的if分支,有几种更简洁的实现方式:
- 第一种是利用JS的假值短路特性,直接在reduce返回结果后追加
|| 0即可。因为本场景下返回值只可能是-1、0、1三个值,其中只有0和-0是假值,||会自动把-0替换为普通0,不会影响1和-1的正常返回:
function cal(A) { return A.reduce((total, currentValue) => total * Math.sign(currentValue), 1) || 0; }
- 第二种是用按位或运算,按位操作会将数值转为32位整数,自动抹除-0的符号位,写法同样精简:
function cal(A) { return A.reduce((total, currentValue) => total * Math.sign(currentValue), 1) | 0; }
- 如果追求更高性能,可以完全绕开乘法和
Math.sign的逻辑,遍历过程中统计负数个数,遇到0直接提前返回0,从根源避免负零产生,大数组场景下效率更高:
function cal(A) { let negativeCount = 0; for (const num of A) { if (num === 0) return 0; if (num < 0) negativeCount++; } return negativeCount % 2 ? -1 : 1; }
三种写法都可以通过所有示例测试:
- 输入
[1,2,3]返回1 - 输入
[1,-2,3]返回-1 - 输入
[1,-2,3,0]返回0
内容的提问来源于stack exchange,提问作者Nguyễn Văn Phong
相关产品推荐
相关产品推荐

