(本文的目标是成为社区Wiki。)
在JavaScript中,0
也可以是-0
或+0
,但是通常的比较将它们视为0
,并且在您需要时会返回true
/期待他们返回false
。
这是在JavaScript中区分-0
形式+0
的不同方式的总结
使用Object.is()
函数在它们之间进行区分
console.log(
Object.is(-0, +0) // expected: false
);
// or:
console.log(
Object.is( Math.sign(-0), Math.sign(+0) ) // expected: false
);
或将-0
和+0
转换为-/ + infinity并比较无穷大
console.log(
(1 / Math.sign(-0)) == (1 / Math.sign(+0)) // expected: false
);
// This hapens:
// (1/-0) == (1/+0)
// When you divide anything with zero you get an infinity (in JavaScript, it's different in regular math)
// -Infinity == +Infinity
// false
注意!!以上解决方案将在所有不允许被零除或没有穷举的语言中失败。
这些语言可能会抛出某种divideByZeroException
。
所有这些比较方法将无法区分-0
和+0
并返回true
:
// All these will return: true (which we don't want)
console.log(
-0 == +0
);
console.log(
-0 === +0
);
console.log(
Math.sign(-0) === Math.sign(+0)
);
console.log(
Math.sign(-0).toString() === Math.sign(+0).toString()
);
// because this hapens:
// -0.toString() === +0.toString()
// "-0" === "+0"
// then the strings are implicitly converted back to numbers again
// -0 === +0
// which are seen as:
// 0 === 0
// true;
Math.sign()
时,它都可以返回-0
或+0
。