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
另请参阅 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
.
的事情
我正在使用 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
另请参阅 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
.