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

JavaScript - Detecting the difference between positive zero and negative zero

我正在使用 MomentJS 来计算两次之间的差异。这个库的奇怪之处在于今天和今天之间的差异是 0。今天和明天之间的差异是 -0。

我的问题是,如何区分 0 和 -0。看来JavaScript对他们一视同仁。

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

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

这里有一个关于 JSFiddle 如何处理返回值的例子(我在澳大利亚,所以根据你在世界上的位置,你可能需要调整今天和明天的日期)

正如 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;
}

1/val > 0 会为所欲为。 Returns true 代表正数,false 代表负数。

这是有效的,因为 1/-0 returns 负无穷大和 1/0 returns 正无穷大,它们是可比较的。你也可以做类似 1/val == Infinity.

的事情