区分+0和-0

IT技术 javascript
2021-01-20 09:16:41

结果证明+0 === -0评估为true尽管+0-0不同的实体。那么,你如何区分+0-0

有一个黑客:

if (1 / myZero > 0) {
   // myZero is +0
} else {
   // myZero is -0
}

我能做得更好吗?

6个回答

ECMAScript中6种Object.is行为类似===,除了它区分阳性和阴性零,并Object.is(NaN, NaN)计算结果为true(请参阅此处的文章。)

Chrome 24 支持Object.is.

如果旧浏览器需要它本文档末尾还有 ECMAScript 5 的替代版本
2021-03-16 09:16:41

这仍然是某种黑客行为,但查看规范表明:

Math.atan2(0, -0) === Math.PI // true
Math.atan2(0,  0) === 0       // true
它可以工作,但在我的 chrome 上比1/zero测试慢 10 倍
2021-03-15 09:16:41
好的,谢谢各位。:) 这是为了我自己的熏陶。(注意,pimvdb 的参考可在bclary.com/2004/11/07/#a-15.8.2.5找到
2021-04-05 09:16:41
@Jared Farrish:是的,部分atan2.
2021-04-06 09:16:41
你有偶然的链接吗?
2021-04-09 09:16:41
你指的是哪些规格?ECMAScript?(不是怀疑,我只是想知道……)
2021-04-13 09:16:41

根据大卫弗拉纳根的书,p。34,将 1 除以零将产生相应的无穷大,然后可以在等式检查中使用它:

1 / 0
> Infinity
1 / -0
> -Infinity

这是无穷大的相等比较的行为:

Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true
这不适用于每个数字:1 / -5e-324结果为-Infinity,但-5e-324 === -0为假。
2021-03-31 09:16:41
当然是真的。我忘记了原来的问题
2021-04-01 09:16:41
@TimothyGu 你的意思是什么?该问题专门询问 +0 和 -0,而不是“每个数字”。
2021-04-10 09:16:41

这将返回 +0:

-0 + 0

这无助于区分 -0 和 +0,但这有助于确保某些值不是 -0。

1 / -0       => -Infinity  
1 / (-0 + 0) => Infinity
或者你可以使用Math.abs(-0).
2021-03-17 09:16:41
这对我来说非常有用,因为我需要特别确保正零,但不要管其他有符号的数字。
2021-03-20 09:16:41

要检查负零,这里有一个简单的解决方案。

function isNegativeZero(n) {
    n = Number( n );
    return (n === 0) && (1 / n === -Infinity);
}