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

Ben*_*air 24 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!');
Run Code Online (Sandbox Code Playgroud)

这是关于JSFiddle如何处理返回值的一个例子(我在澳大利亚,所以取决于你可能需要调整今天和明天的日期)

She*_*acu 48

1/val > 0会做你想做的.true正面和false负面的回报.

这是有效的,因为1/-0返回负无穷大,并1/0返回正无穷大,然后可比较.你也可以这样做1/val == Infinity.

  • 从 ES2015 开始,您还可以使用 Object.is() 检查是否相等。它还检查特殊情况(例如,Object.is(-0, -0) 为 true,而 Object.is(0, -0) 为 false) (2认同)

Mar*_*vin 10

正如Stack Overflow问题(以及评论中)所指出的那样,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
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

另请参阅此博客文章以获取更多详细信息以及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;
}
Run Code Online (Sandbox Code Playgroud)