JavaScript - 检测正零和负零之间的差异

时间:2015-07-23 23:20:04

标签: javascript momentjs

我使用MomentJS来计算两次之间的差异。奇怪的是这个库是今天和今天的区别是0.今天和明天的区别是-0。

我的问题是,如何区分0和-0。似乎JavaScript对待它们是相同的。

例如,如果我编写以下代码:

if (tomorrow === -0)
    console.log('It is tomorrow!');
else if (tomorrow === 0)
    console.log('It is today!');

以下是JSFiddle关于如何处理返回值的示例(我在澳大利亚,因此取决于您可能需要调整今天和明天日期的位置)< / p>

2 个答案:

答案 0 :(得分:47)

1/val > 0会做你想要的。正数为true,负数为false

这是有效的,因为1/-0返回负无穷大,1/0返回正无穷大,然后可比较。您也可以执行1/val == Infinity

之类的操作

答案 1 :(得分:11)

正如this Stack Overflow question(以及评论中)所指出的那样,JavaScript +0 === -0确实按设计评估为true

您可以使用Infinity / -Infinity查看差异(从技术上讲,+0 / -0可能不是产生无限值的唯一数字,所以我离开了额外办理登机手续):

var positiveZero = +0;
var negativeZero = -0;

console.log(positiveZero === 0 && 1/positiveZero === Infinity); // true
console.log(positiveZero === 0 && 1/positiveZero === -Infinity); // false

console.log(negativeZero === 0 && 1/negativeZero === Infinity); // false
console.log(negativeZero === 0 && 1/negativeZero === -Infinity); // true

JSFiddle

另请参阅this blog post以获取更多详细信息,另请参阅ECMAScript 5的另一种解决方案:

function isNegative0(x) {
   if (x!==0) return false;
   var obj=Object.freeze({z:-0});
   try {
      Object.defineProperty(obj,'z',{value:x});
   } catch (e) {return false};
   return true;
}