Подтвердить что ты не робот

JavaScript - обнаружение разницы между положительным нулем и отрицательным нулем

Я использую MomentJS, чтобы рассчитать разницу между двумя раз. Самое странное в этой библиотеке - разница между сегодняшним и сегодняшним днем ​​- 0. Разница между сегодняшним и завтрашним - это -0.

Мой вопрос: как я различаю между 0 и -0. Кажется, JavaScript относится к ним одинаково.

Так, например, если я напишу следующий код:

if (tomorrow === -0)
    console.log('It is tomorrow!');
else if (tomorrow === 0)
    console.log('It is today!');

Вот пример JSFiddle относительно того, как он обрабатывает возвращаемые значения (я в Австралии, поэтому в зависимости от того, где вы находитесь, настройте даты сегодняшнего дня и завтрашнего дня)

4b9b3361

Ответ 1

1/val > 0 сделает то, что вы хотите. Возвращает true для положительных и false для отрицательных.

Это работает, потому что 1/-0 возвращает отрицательную бесконечность, а 1/0 возвращает положительную бесконечность, которые тогда сопоставимы. Вы также можете сделать что-то вроде 1/val == Infinity.

Ответ 2

Как указано в этом вопросе (и в комментариях), в 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

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;
}