Math.sign(-0)不等于Math.sign(+0)

时间:2019-08-12 08:37:38

标签: javascript

(本文的目标是成为社区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;


什么时候有用?

  • 例如,如果您使用数学来计算从负数一侧接近0的极限。
  • 如果要移动物体,可以用正值或负值表示方向,但是即使物体的速度为0,也要保留其方向。
  • 每次使用Math.sign()时,它都可以返回-0+0

另请参见:

0 个答案:

没有答案