JavaScript中Math.abs运算后与-0全等返回true的疑问及解决方法
区分正0和负0的比较问题
问题代码
console.log(Math.abs(-16) % 2 === 0) // true console.log(Math.abs(-16) % 2 === -0) // true(不符合预期)
原因说明
JavaScript里的严格相等运算符===不会区分正0(0)和负0(-0)——尽管二者的二进制底层表示不同,但===会将它们判定为相等,所以才会出现上述不符合预期的结果。
解决方案
有两种简单方式可以实现区分正0和负0的比较:
方法1:使用Object.is()
ES6引入的Object.is()方法会严格区分正0和负0,同时也能正确处理NaN的比较(这是===做不到的)。修改后的代码如下:
console.log(Object.is(Math.abs(-16) % 2, -0)) // false(符合预期)
方法2:利用倒数特性区分
正0的倒数是Infinity,负0的倒数是-Infinity,可以通过这个差异来判断:
const result = Math.abs(-16) % 2; console.log(1 / result === 1 / -0) // false(符合预期)
内容的提问来源于stack exchange,提问作者Jefferson Chukwu
相关产品推荐
相关产品推荐

