在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
在ECMAScript 5.1规范中,+0和-0是有区别的。
为什么+0 === -0的结果为真?
当前回答
如果需要支持-0和+0的符号函数:
var sign = x => 1/x > 0 ? +1 : -1;
它就像数学一样。符号,只不过符号(0)返回1而符号(-0)返回-1。
其他回答
我将添加这个作为答案,因为我忽略了@user113716的注释。
你可以这样测试-0:
function isMinusZero(value) {
return 1/value === -Infinity;
}
isMinusZero(0); // false
isMinusZero(-0); // true
回答原来的题目+0和-0是一样的吗?:
brainslugs83(在Spudley回答的评论中)指出了一个重要的情况,在JS中+0和-0是不一样的-实现为函数:
var sign = function(x) {
return 1 / x === 1 / Math.abs(x);
}
除了标准数学,这个会。返回+0和-0的正确符号。
0有两种可能的值(位表示)。这不是唯一的。特别是在浮点数中,这种情况可能发生。这是因为浮点数实际上被存储为一种公式。
整数也可以以不同的方式存储。您可以使用带有额外符号位的数值,因此在16位空间中,可以存储15位整数值和符号位。在这种表示中,值1000(十六进制)和0000都是0,但其中一个是+0,另一个是-0。
这可以通过从整数值中减去1来避免,因此它的范围从-1到-2^16,但这将是不方便的。
一个更常见的方法是将整数存储在“两个补体”中,但显然ECMAscript没有选择这样做。在这种方法中,数字范围从0000到7FFF正。负数从FFFF(-1)到8000。
当然,同样的规则也适用于更大的整数,但我不希望F变弱。;)
我将其归咎于严格相等比较方法('===')。 看4d部分
参见7.2.13规范严格相等比较
如果需要支持-0和+0的符号函数:
var sign = x => 1/x > 0 ? +1 : -1;
它就像数学一样。符号,只不过符号(0)返回1而符号(-0)返回-1。